0

私はiPhoneが初めてで、UITableViewからセルを削除しようとしています.1回目はうまく削除されますが、2回目は次のエラーが表示されます:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Invalid update: invalid number of rows in section 0.  The number of rows 
contained in an existing section after the update (3) must be equal to the number 
of rows contained in that section before the update (3), plus or minus the number 
of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or 
minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

ここに私のテーブルのコードがあります:

- (void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
Book_own *temp= (Book_own *)[self.books objectAtIndex:indexPath.row];

if (editingStyle == UITableViewCellEditingStyleDelete) {
    // Delete the row from the data source

    [books removeObjectAtIndex:indexPath.row];

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

    isDeleted = @"true";
    deletedBook_id = temp.bo_id;

    [self viewDidLoad];

}

else if (editingStyle == UITableViewCellEditingStyleInsert) {
    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}  

}


 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 2;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.

NSDictionary *dictionary = [listOfItems objectAtIndex:section];
NSArray *array = [dictionary objectForKey:@"myBooks"];
return [array count];
}

ViewDidLoad で次のコードを書きました。

NSDictionary *mbooks = [NSDictionary dictionaryWithObject:books forKey:@"myBooks"];

NSDictionary *mgroups = [NSDictionary dictionaryWithObject:filteredParts forKey:@"myBooks"];
listOfItems = [[NSMutableArray alloc] init];

[listOfItems addObject:mbooks];
[listOfItems addObject:mgroups];

この問題を解決する方法を教えてもらえますか?? 前もって感謝します。

4

4 に答える 4

1

何が起こっているかというと、アイテムを削除していないか、複数の削除を許可しているときにアイテムを 1 つだけ削除しているということです。以下のように本当に削除されているかどうかを確認するか、削除されていない場合はデータをリロードして調整できます。

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        BOOL success = [self removeFile:indexPath];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        if (!success) [tableView reloadData];
    }
}

次に、このメソッドはデータソース アイテムを削除します (これは自分のプロジェクトからのものであるため、名前を調整する必要があります。

-(BOOL) removeFile:(NSIndexPath *)indexPath{
    // Removes from the datasource and the filesystem
    NSURL *fileURL = [self.dataSource objectAtIndex:indexPath.row];
    NSError *error;
    BOOL success = [[NSFileManager defaultManager] removeItemAtURL:fileURL error:&error];
    if (success) {
        [self.dataSource removeObjectAtIndex:indexPath.row];
    } else {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error" message:[error localizedDescription] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
        [alert show];
        [alert release];
        [self.dataSource removeObjectAtIndex:indexPath.row];
    }
    return success;
}
于 2012-08-28T17:54:44.210 に答える
1

コードを正しく読んでいれば、データ ソースは listOfItems です。テーブルのデータ ソースから行を削除する必要があります。一般的な規則として、アイテムを削除または追加するUITableView場合は、データベース ソースを更新する必要があります。

[listOfItemsremoveObjectAtIndex:indexPath.row];
于 2012-08-28T17:37:03.770 に答える
0

このエラーは、削除後に行が 1 つ少なくなる必要があることを示しています。データソース コードがモデルについてレポートする方法に一貫性がないため、失敗します。

numberOfRowsInSection の答え方を見てください。正しいと思いますが、最初にセクション インデックスが表す配列を選択し、次にその配列のカウントに答えます。

削除にも同じロジックを適用する必要があります。削除する配列は、indexPath.section で示される配列である必要があります。このことを考慮:

- (void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    // the array you manipulate here must be the same array you use to count
    // number of rows, and the same you use to render rowAtIndexPath

    NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
    NSArray *array = [dictionary objectForKey:@"myBooks"];

    // in order to be edited, it must be mutable
    // you can do that on the fly here, or set it up as mutable
    // let's make it temporarily mutable here:
    NSMutableArray *mutableCopy = [array mutableCopy];

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [mutableCopy removeObjectAtIndex:indexPath.row];

        // if it's setup mutable, you won't need to replace the immutable copy in the dictionary.
        // but we just made a copy, so we have to replace the original
        [listOfItems replaceObjectAtIndex:indexPath.section withObject:[NSArray arrayWithArray:mutableCopy]];

        // and so on
于 2012-08-28T17:51:06.400 に答える
0

まず、[self viewDidLoad] を呼び出さないでください。このメソッドは手動で呼び出さないでください。

テーブルビューに対して更新メソッドを呼び出していないと思います。これで問題が解決する場合があります。

[tableView beginUpdates];
[books removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

編集: コードをより詳しく調べる必要もあります。indexPath の行から直接データソース配列からレコードを削除しています。これは、tableView に 2 つのセクションがあるという事実を考慮すると問題になる可能性があります。

于 2012-08-28T17:44:03.563 に答える