我在向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];
}
答案 0 :(得分:7)
确保您创建的表视图已设置委托和数据源。
例如:
[self.unsignedTableView setDelegate:self];
[self.unsignedTableView setDatasource:self];
我认为这次崩溃的原因是数据源和委托方法没有被调用
答案 1 :(得分:3)
在使用insertRowsAtIndexPaths
添加行时,确保您的UITableViewDataSource方法还会为添加的单元格返回新的数量和新对象。
检查tableView:numberOfRowsInSection:
和tableView:cellForRowAtIndexPath:
。
否则你会得到NSInternalInconsistencyException
例外。
如果您尝试使用insertRowsAtIndexPaths添加所有单元格,请停止执行操作并阅读this。
答案 2 :(得分:3)
您是在点击后根据数组更改numberOfSection
和numberOfRowsInSection
吗?
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中。