9

我有一个 detailViewController 和一个 MasterViewController。MasterViewController 是我拥有 UITableView 的地方。我的表格中有两个部分,顶部是项目列表,底部有一个条目,@“添加新行”。

@“添加新行”转到可以编辑 UITextField 的 detailViewController。然后当按下保存时,我这样做:

- (IBAction)saveButtonPressed:(id)sender {
    if ([detailControllerDelegate respondsToSelector:@selector(setNewmap:)]) {
        if (self.textField.text.length > 0) {
            [self.textField endEditing:YES];
            [detailControllerDelegate setValue:self.textField.text forKey:@"newmap"];
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
}

然后在 MasterViewController 中,

- (void)setNewmap:(NSString *)newmap {
    if (![newmap isEqualToString:_newmap]) {
        _newmap = newmap;

        [self.maps addObject:_newmap];

        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.maps count] inSection:MAPS_SECTION];
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

它在 reloadRowsAtIndexPaths 上崩溃并显示以下消息:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete row 3 from section 0 which only contains 2 rows before the update'

我不确定为什么会调用它。我认为当您执行 tableViewUpdates 时,您会更新模型,我使用self.maps addObject:newmap];. 我记录了计数,计数是正确的。更新模型后,我认为您可以自由地重新加载行。

如果我不重新加载特定行,而只是在 tableView 上调用 reloadData,那么它不会崩溃。不知道这里有什么区别。就像我更新 self.maps 模型时没有更新 numberOfRowsInSection 委托方法一样。

4

4 回答 4

34

我知道自从提出这个问题以来已经有一段时间了,但我认为问题可能在于,reloadRowsAtIndexPaths 依赖于表中这些行的先前存在,并在内部删除、重新创建并将它们重新插入(在引擎盖下)。因此,当您在表中没有这些行的情况下调用特定的重新加载时,它会尝试删除不存在的行。

我在集合视图中遇到了同样的问题。完全重新加载起作用的原因是因为它刷新了整个事物并且不依赖于先前的状态,只依赖于数据源的当前状态。

这是我对这个问题的看法。

于 2013-01-15T18:01:52.717 回答
1
    - (NSInteger)tableView:(UITableView *)tableView 
     numberOfRowsInSection:(NSInteger)section{}

在此方法中,您应该动态返回一个整数。在更新之前,您应该获取节中的新行数并返回它。

于 2012-06-01T05:14:54.857 回答
1

如果您重新加载不存在的行或一开始就从未存在过的行,就会发生这种情况。

于 2015-07-15T13:10:16.983 回答
0

数组或字典(在本例中为 self.maps)的计数始终比其最后一项高 1,因为数组是零索引的:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.maps count]-1 inSection:MAPS_SECTION];

于 2012-06-01T05:38:03.820 回答