我有一个通过核心数据的NSFetchedResultsControler
连接的表格视图。单元格具有一个带有属性文本的UILabel
和一个表示对象UISwitch
值的isEnabled
。在单元内,我有一个功能:
func configure(with viewModel: CellViewModel) {
myCustomLabel.attributedText = viewModel.attributedText // NSMutableAttributedText
}
锁定开关会更改对象上的isEnabled
值,这会导致NSFetchedResultsControler
升高,从而调用:
let cell: MyTableViewCell = tableView.dequeueReusableCell(forIndexPath: indexPath) //my custom helper method
let cellViewModel = viewModel.itemModel(at: indexPath)
cell.configure(with: cellViewModel)
我不想使用reloadData
,reloadRows
或reloadSections
,因为我想在更改单元格状态的同时保留动画,并避免仅翻转开关即可避免单元格褪色的动画。我知道这是一种很糟糕的方法,但是必须保留动画。
问题是: attributedText
不会立即在标签上更改。仅在单元被重用之后。调试器会正确显示标签的新值。我尝试过:
nil
),setNeedDisplay
attributedText
没有任何效果。您有任何想法为什么会这样吗?
系统为iOS 11.4,XCode 9.4.1。
答案 0 :(得分:0)
我认为不是
let cell: MyTableViewCell = tableView.dequeueReusableCell(forIndexPath: indexPath)
您应该使用:
tableView.cellForRow(at: indexPath)
这将为您返回该indexPath的单元格实例。通过调用“ dequeueReusableCell”,实际上是在说您想要一个新的单元格。
假设我得到了您想要实现的目标,并且您的摘录不是来自
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
方法。
如果这样做不起作用,可能值得添加一个git链接来查看您的代码。
希望有帮助!
答案 1 :(得分:0)
如果将myCustomLabel.attributedText = viewModel.attributedText
包裹在DispatchQueue.main.async { }
中,它将起作用:
DispatchQueue.main.async {
myCustomLabel.attributedText = viewModel.attributedText
}