簡體   English   中英

在用戶看到表格之前在表格視圖中顯示它

[英]Displaying an array in a table view before the user see it

我正在從Firebase提取數據並在表格視圖中顯示它。 我用接收到的數據填充數組,並使用該數組填充tableview,但是未顯示數據。

我意識到問題是在填充數組之前正在加載tableview。 我嘗試將reloadData放入viewdidload中,但這會使數據在顯示后彈出,而且看起來並不干凈。

如何在視圖出現之前獲取表格視圖以加載數據,以使過渡順利進行?

這段代碼在我的viewdidload方法中:

let categoryRef = Database.database().reference().child("category/\(category)")
    let user = Auth.auth().currentUser
    if let user = user {
        let uid = user.uid
        categoryRef.observeSingleEvent(of: .value, with: { (snapshot) in
            if snapshot.hasChildren(){
                for child in (snapshot.value as? NSDictionary)! {
                    if let object = child.value as? [String:AnyObject]{
                        let name = object["name"] as! String
                        self.nameArray.append(name)
                        self.categoryDict["\(name)"] = child.key as! String
                    }

                }
            }

        })
    }

}

追加所有子項后,嘗試重新加載數據:

let categoryRef = Database.database().reference().child("category/\(category)")
    let user = Auth.auth().currentUser
    if let user = user {
        let uid = user.uid
        categoryRef.observeSingleEvent(of: .value, with: { (snapshot) in
            if snapshot.hasChildren(){
                for child in (snapshot.value as? NSDictionary)! {
                    if let object = child.value as? [String:AnyObject]{
                        let name = object["name"] as! String
                        self.nameArray.append(name)
                        self.categoryDict["\(name)"] = child.key as! String
                    }

                }
                self.tableView.reloadData()
            }

        })
    }

}

func insertSections(IndexSet, with: UITableViewRowAnimation)調用func insertSections(IndexSet, with: UITableViewRowAnimation)但請記住將其包裝在對beginUpdatesendUpdates 還要確保在主隊列上更新UI。

因為

categoryRef.observeSingleEvent

如果是異步的,則應該在塊完成后重新加載表視圖,這是@barbarity建議的方式。

如果您想要更平滑的過渡,請開始通話

let categoryRef = Database.database().reference().child("category/\(category)")

在展示viewController之前,先設置數組,然后展示它。

但是在大多數情況下,使用異步處理的做法是開始在viewDidLoad上加載數據並具有UI加載機制(旋轉器)

我想您可以提出其他觀點,使您在數據准備好后感覺到“數據彈出”的感覺。

在極端情況下,您可以嘗試隱藏整個表視圖,甚至在屏幕上顯示“活動指示器”,然后在准備好表視圖的數據后顯示表視圖和隱藏指示器(在Objective-C中):

- (void)viewDidLoad {

    //do init work ...

    self.tableview.hidden = YES;
    [self showIndicator];
    [self requestDataFinish:^{
          self.tableview.hidden = NO;
          [self hideIndicator];
          [self.tableview reload];
    }];        

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM