私のテーブルビューは、インプレース編集と追加を使用しています。編集ボタンを押すと新しい行が追加され、この新しい行を編集してコミットできます。新しい行をテーブルビューにコミットすると、新しい行が追加され、空白のセルが下に移動します。このセルは後で編集して、別の行を再度追加できます。ただし、同じ編集セッション中に別の行を追加しようとすると、エラーが発生します。
*** Assertion failure in -[UITableView _endCellAnimationsWithContext:]
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'attempt to insert row 2 into section 0, but there are only 2 rows in section 0 after the update'
以前は1行だけを追加したときにこのエラーが発生していましたが、インプレース編集のチュートリアルを実行した後、解決したと思いました。関連する方法は次のとおりです。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
int count = [items count];
if(self.editing)count++;
return count;
}
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
[super setEditing:editing animated:animated];
[keyphraseTextField setEnabled:YES];
NSArray *paths = [NSArray arrayWithObject:
[NSIndexPath indexPathForRow:[items count] inSection:0]];
if (editing)
{
[[self tableView] insertRowsAtIndexPaths:paths
withRowAnimation:UITableViewRowAnimationTop];
}
else {
[[self tableView] deleteRowsAtIndexPaths:paths
withRowAnimation:UITableViewRowAnimationTop];
}
}
- (void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
[self deleteItemAtIndexPath:indexPath];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
NSIndexPath *thePath = [NSIndexPath indexPathForRow:[items count] inSection:0];
DBAccess *dbaccess = [[DBAccess alloc] init];
NSInteger keyphraseCount = [dbaccess getDomainKeyphraseCount:domain_id];
NSInteger keyphraseCountLimit = [dbaccess getDomainKeyphraseCountLimit:domain_id];
[dbaccess closeDatabase];
[dbaccess release];
if(![keyphraseTextField.text isEqualToString:@""] && keyphraseCount<keyphraseCountLimit){
[self insertItemAtIndexPath:thePath];
[self readItems];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:thePath] withRowAnimation:UITableViewRowAnimationLeft];
[self makeNSURLConnection];
}else{
if([keyphraseTextField.text isEqualToString:@""]){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Please insert Keyphrase." delegate:self cancelButtonTitle:@"Not Now." otherButtonTitles:@"Upgrade!", nil];
[alert setTag:10];
[alert show];
[alert release];
}
if(keyphraseCount>=keyphraseCountLimit){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Kindly upgrade your subscription to add more keyphrases!" delegate:self cancelButtonTitle:@"Not Now." otherButtonTitles:@"Upgrade!", nil];
[alert setTag:10];
[alert show];
[alert release];
}
}
}
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.editing == NO || !indexPath) return UITableViewCellEditingStyleNone;
if (self.editing && indexPath.row == ([items count])) {
return UITableViewCellEditingStyleInsert;
} else {
return UITableViewCellEditingStyleDelete;
}
return UITableViewCellEditingStyleNone;
}
この問題を解決して、ユーザーが1回の編集「セッション」で行を次々に追加できるようにするにはどうすればよいですか。