Swift 4:UITableViewCell 在初始加载时不会显示数据,但会在第二次加载时加载

Posted

技术标签:

【中文标题】Swift 4:UITableViewCell 在初始加载时不会显示数据,但会在第二次加载时加载【英文标题】:Swift 4: UITableViewCell does will not display data upon initial load, but will load on second load 【发布时间】:2018-03-29 17:30:20 【问题描述】:

我在我的应用程序中遇到了一个非常有趣的问题。在查看用户个人资料页面时,我的 tableview 中的数据被拉出并打印到控制台中,但问题是我的信息不会加载到我的 tablecell 中。

如果我要离开当前选项卡,然后返回个人资料页面,我的数据将被加载。我正在使用 firebase 来提取我的信息。

我希望数据在第一次查看页面时就在那里。

ProfileViewController

    var cellId = "cell"
    var userGames = [Game]()
    var userCurrentGames = [Any]()

    override func viewDidLoad() 
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self

        tableView.register(ProfileGameCell.self, forCellReuseIdentifier: cellId)

    //I CALL MY FUNCTIONS UPON FIRST LOAD
        getCurrentUser()
        getUsersGames()

        
    

    override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)

    //I CALL FUCTIONS EVERY TIME THE VIEW LOADS INCASE DATA CHANGES
        getCurrentUser()
        getUsersInformation()
        getUsersGames()

    

    func getUsersGames() 
        let ref = Database.database().reference()
        let current = getCurrentUser()

//I FIND ALL THE GAMES IN THE USERS REF AND APPEND THEIR KEY TO THE ARRAY
            ref.child("users").child(current).child("user games").observe(.value, with: (snapshot) in
                if let snapshot = snapshot.children.allObjects as? [DataSnapshot] 
                    self.userCurrentGames = []
                    for snap in snapshot 
                        let gameKey = snap.key

                        print("SNAPSHOT DATAAA: \(gameKey)")
                        self.userCurrentGames.append(gameKey)
                    
                
            )
            displayUsersGames()
    

func displayUsersGames() 
    let ref = Database.database().reference()
    self.userGames = []
//I FIND ALL THE GAMES AND APPEND THEM TO THE ACTUAL GAME ARRAY
    for i in userCurrentGames 
        ref.child("games").child("\(i)").observeSingleEvent(of: .value, with:  (gameSnap) in
            if let gameDict = gameSnap.value as? Dictionary<String, AnyObject> 
                let key = gameSnap.key
                let game = Game(postKey: key, gameData: gameDict)
                self.userGames.append(game)

                self.tableView.reloadData()
            
        )
    

表格视图函数

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let game = userGames[indexPath.row]
    if let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as? ProfileGameCell 
        cell.adminButton.tag = indexPath.row
        cell.configureUserGameCell(game: game)
        return cell
     else 
        return ProfileGameCell()
    


func numberOfSections(in tableView: UITableView) -> Int 
    return 1


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return userGames.count

【问题讨论】:

您应该将guard-let 用于UITableViewCell 而不是if-let 【参考方案1】:

问题很清楚:

observe 异步工作——结果稍后返回——所以当调用displayUsersGames()userCurrentGames 为空。

解决方案是将displayUsersGames() 移动到完成块中

...   
ref.child("users").child(current).child("user games").observe(.value, with: (snapshot) in
        if let snapshot = snapshot.children.allObjects as? [DataSnapshot] 
            self.userCurrentGames = []
            for snap in snapshot 
                let gameKey = snap.key

                print("SNAPSHOT DATAAA: \(gameKey)")
                self.userCurrentGames.append(gameKey)
            
            self.displayUsersGames()
        
    )

注意:

强制向下转换单元格

let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! ProfileGameCell

代码不能崩溃。如果是这样,则表明存在设计错误。

【讨论】:

以上是关于Swift 4:UITableViewCell 在初始加载时不会显示数据,但会在第二次加载时加载的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4:无法在包中加载 NIB:自定义 UITableViewCell 的“NSBundle”(无 IB)

Swift 4:按钮在另一个 UITableViewCell 中触发相同的操作

当我在 swift 4 中单击 uitableviewcell 时如何传递数据?

Swift 4:UITableViewCell 在初始加载时不会显示数据,但会在第二次加载时加载

如何根据同一节 Swift 4 中的数组更改 UITableViewCell 颜色

当 UIStepper 在 Swift 4 中以编程方式点击时如何更改 UILabel 的文本,如果它们都在 UITableViewCell 中?