UITableViewCell的属性文本未更新

时间:2018-07-27 13:49:47

标签: swift uitableview core-data

我有一个通过核心数据的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)

我不想使用reloadDatareloadRowsreloadSections,因为我想在更改单元格状态的同时保留动画,并避免仅翻转开关即可避免单元格褪色的动画。我知道这是一种很糟糕的方法,但是必须保留动画。

问题是: attributedText不会立即在标签上更改。仅在单元被重用之后。调试器会正确显示标签的新值。我尝试过:

  • this suggestion(预先将字体和颜色设置为nil),
  • 在标签及其超级视图上调用setNeedDisplay
  • 首先设置非归因文本,然后设置attributedText

没有任何效果。您有任何想法为什么会这样吗?

系统为iOS 11.4,XCode 9.4.1。

2 个答案:

答案 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 }