gpt4 book ai didi

swift - 导航回 tableview View Controller 时更新 tableview 而不是整个重新加载

转载 作者:行者123 更新时间:2023-11-28 10:50:52 25 4
gpt4 key购买 nike

我有一个包含 UITableView 的主页 UIViewController。在这个 View Controller 上,我通过在 ViewWillAppear 中读取来自 firebase 的数据来显示当前用户的所有游戏。从这个 View Controller ,用户可以按下一个按钮来开始一个新游戏,这个按钮将他们带到下一个 View Controller 来选择设置,然后更新 firebase 中的数据并添加一个新的 child 。一旦他们导航回主视图 Controller ,是否只更新添加新子项的数据,而不是像我目前正在做的那样再次加载表格 View 的所有游戏?

这是我当前的代码:

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

if let currentUserID = Auth.auth().currentUser?.uid {
let gamesRef = Database.database().reference().child("games").child(currentUserID)
self.games = []

gamesRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let game = child as! DataSnapshot
self.games.append(game)
self.tableView.reloadData()
}
})
}
}

最佳答案

我认为你可以使用 observeSingleEvent.childAdded

您可以在 viewDidLoad 中加载所有数据,在 viewWillAppear 中加载单个子项,因为 viewDidLoad 最初会被调用一次

由于这两个方法最初都会被调用,所以我们可以有一个 bool 标志,这样我们就可以控制哪些代码首先运行,哪些不运行,因为 viewWillAppearviewDidLoad 之后调用> 所以我们在 viewWillAppear 方法中改变这个标志的值,然后使用这个标志控制 viewWillAppear 中代码的执行

class SomeVC: UIViewController {

var flag = false
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if flag {
//do your work here
}else {
flag = true
}

}
}

已编辑:另一种解决方案是您不在 viewDidLoad 中执行任何操作,而仅在 viewWillAppear 中执行此操作,因为在这种特定情况下,两个调用中的数据都是相关的(从 Firebase 获取数据)

class SomeVC: UIViewController {

var flag = false
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if flag {
//fetch only one child
}else {
//fetch all the data initially
flag = true
}

}
}

关于swift - 导航回 tableview View Controller 时更新 tableview 而不是整个重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46209382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com