向UITableView添加行时出现NSInternalInconsistencyException

时间:2012-04-04 10:18:31

标签: iphone ios ipad

我在向UITableView添加新行时遇到了麻烦。我在stackoverflow上读了类似的问题,谷歌搜索,...没有帮助我。

我有空的NSMutableArray * dataForList和UITableView的数据。点击屏幕后,我想添加新行。此错误显示:

  

* 因未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'尝试将第0行插入第0部分,但更新后第0部分只有0行'

代码:

NSArray *insertIndexPaths = [NSArray arrayWithObject: 
                             [NSIndexPath indexPathForRow:
                              [self.dataForList count] // is zero now
                              inSection:0]];

[self.dataForList addObject:newRow];
// [self.dataForList count] is 1 now

[self.unsignedTableView beginUpdates];
[self.unsignedTableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationNone];
[self.unsignedTableView endUpdates]; // on this line error ocours

我错过了什么?

所有UITableView方法

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) indexPath {}

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger) section {
return [self.mainController.dataForList count];
}

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *) indexPath{
return 38.0f;
}

- (UITableViewCell *) tableView: (UITableView *) tableView
      cellForRowAtIndexPath: (NSIndexPath *) indexPath {
// call render method in view, it works fain
return [self.signUpToTestView renderUnsignedCell:tableView cellForRowAtIndexPath:indexPath];
}

10 个答案:

答案 0 :(得分:7)

确保您创建的表视图已设置委托和数据源。

例如:

 [self.unsignedTableView setDelegate:self];
 [self.unsignedTableView setDatasource:self];

我认为这次崩溃的原因是数据源和委托方法没有被调用

答案 1 :(得分:3)

在使用insertRowsAtIndexPaths添加行时,确保您的UITableViewDataSource方法还会为添加的单元格返回新的数量和新对象。

检查tableView:numberOfRowsInSection:tableView:cellForRowAtIndexPath:

否则你会得到NSInternalInconsistencyException例外。

如果您尝试使用insertRowsAtIndexPaths添加所有单元格,请停止执行操作并阅读this

答案 2 :(得分:3)

您是在点击后根据数组更改numberOfSectionnumberOfRowsInSection吗?

return [arr count];

并尝试重新加载表

 [table reloadData];

答案 3 :(得分:1)

我遇到了同样的问题,但意识到将数据添加到列表中更简单,然后重新加载表,如下所示:

    [self.dataForList addObject:newRow];
    [self.unsignedTableView reloadData];

然后,委托方法接管返回正确的行计数:

     - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        // Return the number of rows in the section.
        return [self.unsignedTableView count];
     }

答案 4 :(得分:1)

您遇到问题的原因是您要在两个不同的位置更改数据源和用户界面。您对数据源的更新以及插入调用都必须位于相同的开始/结束块中。

因此,只需在addObject调用前移动beginUpdates调用即可修复问题。

答案 5 :(得分:0)

这是一个想法

在事件调用时(当数组内容发生变化时)将布尔值设置为true [tableView reloadData];在tableView中:numberOfRowsInSection:重置数字。

请务必同时更改tableView:cellForRowAtIndexPath:相应

答案 6 :(得分:0)

if (indexpath) {
      [self.tableView beginUpdates];
      [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexpath] withRowAnimation:UITableViewRowAnimationMiddle];
      [self.tableView endUpdates];
}

答案 7 :(得分:0)

我遇到了同样的问题并解决了我的问题,我没有初始化我的表填充的NSMutableArray。我做的一切都是正确的,但忘记了重要的一点。

myArrayName = [[[NSMutableArray alloc] init]];

您的情况可能会有所不同,我建议您在尝试修改代码之前退一步看一下代码。 几个月后,但希望这有帮助!

答案 8 :(得分:0)

对旧问题的回答..

NSArray *insertIndexPaths = [NSArray arrayWithObject: 
                             [NSIndexPath indexPathForRow:
                              [self.dataForList count] // is zero now
                              inSection:0]];

[self.dataForList addObject:newRow];
// [self.dataForList count] is 1 now

交换它们应该有效:

[self.dataForList addObject:newRow];
// [self.dataForList count] is 1 now

NSArray *insertIndexPaths = [NSArray arrayWithObject: 
                             [NSIndexPath indexPathForRow:
                              [self.dataForList count] // is also 1 now, hooray
                              inSection:0]];

答案 9 :(得分:0)

当我遇到这个问题时,我得到的是我的ReuseIdentifiers不一样的东西。对我来说,唯一的区别是大写字母。一开始不要认为你的问题太荒谬了。仔细检查所有简单的事情。

如果您使用的是Storyboard,则应将字符串从接口构建器中的单元属性复制并粘贴到tableView代码中的ReuseIdentifier中。