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 中?