如何更新 UITableViewCell?

Posted

技术标签:

【中文标题】如何更新 UITableViewCell?【英文标题】:How to update UITableViewCell? 【发布时间】:2019-12-24 16:12:14 【问题描述】:

我有自定义 UITableViewCell 属性count: Int?。根据这个属性,我渲染了 UITextFields 的数量。 (例如count == 1 --> 一个 UITextField,count == 2 --> 两个 UITextField)。

稍后当某些事件发生时,我想为此标签设置新值。这是我的工作:

在我的 UIViewController 中:

@objc func onDidReceiveEvent(_ notification: Notification) 
        guard let count = notification.object as? Int else  return 
        guard let cell = self.tableView.cellForRow(at: IndexPath(row: 2, section: 0)) as? MyCustomCell else  return 

        cell.count = count
        self.tableView.reloadRows(at: [IndexPath(row: 2, section: 0)], with: .automatic)
        // I also tried self.tableView.reloadData()

我在override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 中设置了断点,我看到在这段代码之后单元格正在更新,但属性count 没有更新。我做错了什么?

【问题讨论】:

【参考方案1】:

这个

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?)

在创建单元格时调用一次,然后单元格出列,您需要添加一个

func configure(_ count:Int)

在您的单元格自定义类中并从cellForRowAt 调用它或在此处刷新

guard let cell = self.tableView.cellForRow(at: IndexPath(row: 2, section: 0)) as? MyCustomCell else  return   
cell.configure(count)

【讨论】:

【参考方案2】:

在控制器中创建属性count

var count = 0 // or another default value

cellForRow 中,将count 的值赋给单元格的count 属性

if indexPath.row == 2 
   cell.count = count

onDidReceiveEvent 更新count 并重新加载行

@objc func onDidReceiveEvent(_ notification: Notification) 
    guard let count = notification.object as? Int else  return 
    self.count = count
    self.tableView.reloadRows(at: [IndexPath(row: 2, section: 0)], with: .automatic)

【讨论】:

【参考方案3】:

如果不知道您的代码是什么样子就很难说,但我假设您的 UITableViewDataSource 不是最新的,因为 onDidReceiveEvent() 被调用。

因此,如果我的假设是正确的,那么您唯一需要做的就是确保在致电 reloadRows() 之前更新您的 UITableViewDataSource

@objc func onDidReceiveEvent(_ notification: Notification) 
    guard let count = notification.object as? Int else  return 
    // Make sure that the dataSource of self.tableView is updated before you update the cell
    self.tableView.reloadRows(at: [IndexPath(row: 2, section: 0)], with: .automatic)

【讨论】:

以上是关于如何更新 UITableViewCell?的主要内容,如果未能解决你的问题,请参考以下文章

故事板:如何向原型 UITableViewCell 添加插座?

iOS:如何将 UITableViewCell 附件按钮向左移动

自定义 UITableViewCell 的高度

UITableviewcell的性能问题

UITableviewcell 是错误的数据

UITableViewCell 中 UIImageView 上的 UITapGestureRecognizer