我有一个特殊的难题,我需要UILabel
内的特定UITableViewCell
来更新每一分钟。目前,每一分钟,整个单元格都刷新并显示在上一个单元格下方,如下所示,我想要做的就是刷新UILabel
watchTime
:
这是我的tableView,其中我从模型
初始化观察时间分钟数func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "watchTimeCell", for: indexPath) as! WatchTimeCell
if userModel.count > indexPath.row {
//this is the value i want to update
cell.watchTime.text = "\(String(describing: userModel[indexPath.row].watchTime!))"
}
return cell
}
以下是我目前更新我的手机的方式:
@objc func updateCounting(){
watchTime += 1
if watchTime % 60 == 0 {
let userRef = Database.database().reference().child("users").child(uid!).child("watchTime")
userRef.runTransactionBlock({ (currentData: MutableData) -> TransactionResult in
let newValue: Int
if let existingValue = (currentData.value as? NSNumber)?.intValue {
newValue = existingValue + 1
} else {
newValue = 1
}
currentData.value = NSNumber(value: newValue)
//this is the line where I reload the cell
DispatchQueue.main.async(execute: {
self.watchTableView.reloadData()
})
return TransactionResult.success(withValue: currentData)
})
watchTime = 0
}
}
最好的方法是什么?谢谢!
编辑:已添加numberOfRowsInSection
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return userModel.count
}
答案 0 :(得分:2)
您正在做的事情对于表格视图基本上是正确的。您更新模型并调用reload
将cellForRowAt
传播到表视图。在这种情况下,您可以通过调用reloadRows(at:with:)
来节省一些开销,以便仅重新加载一个单元格。
...除
您只有一个单元格。但是单细胞表视图是荒谬的。它的目的是什么?要使界面可滚动?然后只做一个滚动视图。现在您可以直接更新标签。
答案 1 :(得分:0)
我会创建那个单元格,并在持有tableView的ViewController中引用它。
let mainCell = WatchTimeCell()
在WatchTimeCell类中,我将添加一个公共函数来更新时间计数
public func updateTimeCountLabel(_ count: Int) {
self.nameOfLabel.text = "\(count)"
}
然后在updateCounting()中我会调用WatchTimeCell中的updateTimeCountLabel。
self.mainCell.updateTimeCountLabel(newValue)
但是numberOfRowsForSection中发生了一些事情,你可以发帖吗?