在对“dateModified”进行排序时遇到了类似的问题,但我也在单元格的标签上显示了该属性。“移动”和“更新”都是必需的。仅调用了“移动”,因此正确的单元格被带到了列表的顶部,但标签文本没有更新。
我的简单 UITableViewCell 解决方案。
首先,您像往常一样拨打 .move 电话。在您调用自定义配置方法之后直接 - 该方法负责为单元格上的“更新”设置动画。
 func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
    switch type {
    case .insert:
        tableView.insertRows(at: [newIndexPath!], with: .fade)
    case .delete:
        tableView.deleteRows(at: [indexPath!], with: .fade)
    case .update:
        tableView.reloadRows(at: [indexPath!], with: .fade)
    case .move:
        tableView.moveRow(at: indexPath!, to: newIndexPath!)
        // Can't "reload" and "move" to same cell simultaneously.
        // This is an issue because I'm sorting on date modified and also displaying it within a
        // label in the UITableViewCell.
        // To have it look perfect you have to manually crossfade the label text, while the UITableView
        // does the "move" animation.
        let cell = tableView.cellForRow(at: indexPath!)!
        let note = fetchedResultsController.object(at: newIndexPath!)
        configure(cell: cell, note: note, animated: true)
    }
}
配置方法如下所示(注意动画是可选的):
internal func configure(cell: UITableViewCell, note: Note, animated: Bool = false) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium
    dateFormatter.timeStyle = .medium
    let dateString = dateFormatter.string(from: note.dateModified as Date)
    if animated {
        UIView.transition(with: cell.contentView, duration: 0.3, options: .transitionCrossDissolve, animations: {
            cell.textLabel?.text = dateString
        }, completion: nil)
    } else {
        cell.textLabel?.text = dateString
    }
}
在没有动画的情况下重用此处的配置方法:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: CellReuseIdentifier, for: indexPath)
    let note = fetchedResultsController.object(at: indexPath)
    configure(cell: cell, note: note)
    return cell
}
如果您有一个更复杂的单元格(子类),您可能会将 configure 方法移动到子类代码中。重要的部分是有一个方法来更新单元格数据,动画可选。