我有一个detailViewController和一个MasterViewController。 MasterViewController是我拥有UITableView的地方。我的表中有两个部分,项目列表的顶部,底部有一个条目,@“添加新行”。
@“添加新行”转到detailViewController,可以在其中编辑UITextField。然后按下保存时,我这样做:
- (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委托方法没有得到更新。
答案 0 :(得分:1)
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section{}
在此方法中,您应该动态返回一个整数。在更新之前,您应该在section中获取新的行数并将其返回。
答案 1 :(得分:0)
数组或字典的计数(在本例中为self.maps)总是高于其最后一项,因为数组是零索引的:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.maps count]-1 inSection:MAPS_SECTION];