3

我的应用程序在 iOS6 中运行良好,但是当我使用与我正在使用的相同代码更新 iOS7 时,当我尝试删除表中的一行时出现此错误:

2013-10-02 17:44:11.344 Goal[1877:a0b] *** Assertion failure in -[UITableView
     _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2903.2/UITableView.m:1330
2013-10-02 17:44:11.384 Goal[1877:a0b] *** Terminating app due to uncaught exception     'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows 
in section    0.  The number of rows contained in an existing section after the
 update (1) must be equal to    the number of rows contained in that section 
before the update (1), plus or minus the number   of rows inserted or 
 deleted from that section (0 inserted, 1 deleted) and plus or 
  minus the      number of rows moved into or out of that section  
(0 moved in, 0 moved out).'

如果需要,这里有一些方法

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        // deleting
        NSManagedObjectContext *moc = self.managedObjectContext;
        Goal *goalToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
        [moc deleteObject:goalToDelete];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }

}

另一个

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"GoalCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

// Configure the cell...
cell.textLabel.backgroundColor = [UIColor clearColor];

Goal *goal = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = goal.title;

return cell;
}

不,我没有忘记检查我的手机标识符,

4

3 回答 3

2

我猜你会得到一个错误,因为你调用deleteRowsAtIndexPaths了两次:一次commitEditingStyle在你的NSFetchedResultsControllerDelegate方法中更新你的 MOC。

但真正的问题是你根本不应该打电话deleteRowsAtIndexPaths

当用户操作删除一行时,表格视图会通过委托方法通知您。commitEditingStyle然后,您的工作是更新您的数据模型以与表视图已经知道的一致。您无需通知该表。

只有当您以编程方式修改数据模型时,您才需要通过调用插入/删除/移动方法来通知表视图。

于 2013-10-02T15:27:04.227 回答
1

在调用 [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade] 之前;减少 numberOfRowsInSection 函数返回的“numberOfRows”。

于 2013-10-02T14:12:15.287 回答
1

错误信息很清楚:

  • 更新前的行数 = 1
  • 删除的行数 = 1
  • 更新后的行数 = 1(这应该是 0)

您的 numberOfRowsAtIndexPath 方法实现是错误的。它应该返回比删除前的行数少 1。此方法的返回值应与您希望在 UITableView 上具有的行数相匹配。

此外,您的代码将在任何 iOS 版本上崩溃,而不仅仅是 7。

于 2013-10-02T14:02:45.003 回答