对于具有相同问题的人,这里是解决方案:
在你:
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
确保更新的情况是前插入的情况下...所以不是这样的:
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case .Insert:
self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.Fade);
case .Move:
if(!indexPath!.isEqual(newIndexPath!)) {
self.tableView.moveRowAtIndexPath(indexPath!, toIndexPath: newIndexPath!);
}
case .Update:
let cell = self.tableView.cellForRowAtIndexPath(indexPath!) as! UITableViewCell;
self.configureCell(cell, atIndexPath: indexPath!);
self.tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade);
case .Delete:
self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
}
}
你应该有这样的:
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case .Update:
let cell = self.tableView.cellForRowAtIndexPath(indexPath!) as! UITableViewCell;
self.configureCell(cell, atIndexPath: indexPath!);
self.tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade);
case .Insert:
self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.Fade);
case .Move:
if(!indexPath!.isEqual(newIndexPath!)) {
self.tableView.moveRowAtIndexPath(indexPath!, toIndexPath: newIndexPath!);
}
case .Delete:
self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
}
}
这让我很头疼,但终于找到了解决办法...
你需要休息,否则case语句都将落空,并都将被执行。不能相信这是被接受的答案。 – Matthijs
Swift(3)不需要'break'。这些案件从未出现过。顺序并不重要。 – Matt