私はdetailViewControllerとMasterViewControllerを持っています。MasterViewController は、UITableView がある場所です。テーブルには 2 つのセクションがあります。上部のセクションはアイテムのリスト用で、下部のセクションには @"Add new row" という 1 つのエントリがあります。
@「新しい行を追加」は、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 デリゲート メソッドが更新されないようです。