0

からセルを削除しようとすると、次のUITableViewエラーが表示されます。

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1912.3/UITableView.m:1046 2012-08-02 16:35:13.941 jsontest2[1551:f803] *** 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 (4) must be equal to the number of rows contained in that section before the update (4), 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).' *** First throw call stack: (0x13e0052 0x1571d0a 0x1388a78 0x9c02db 0xbb518 0xc6211 0xc623f 0x2ce9 0xd289d 0x226d70 0x13e1ec9 0x3a5c2 0x3a55a 0xdfb76 0xe003f 0xdf2fe 0x5fa30 0x5fc56 0x46384 0x39aa9 0x12cafa9 0x13b41c5 0x1319022 0x131790a 0x1316db4 0x1316ccb 0x12c9879 0x12c993e 0x37a9b 0x1c22 0x1b95) terminate called throwing an exception**

これが私のコードです:

- (void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    [tabela beginUpdates]; 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    {
        // Get the TAG and ID of Bill to delete
        //UITableViewCell * cell = [self tableView:tabela cellForRowAtIndexPath:indexPath];
        //NSLog(@"%d", cell.tag);

        [tabela deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:YES];      

    }   

    [tabela endUpdates];
    [tabela reloadData];

}

助けてくれてありがとう!

編集

self.billsArray = [[NSMutableArray alloc] init];
self.billsArray = [resultsDictionary objectForKey:@"bills"];

4

2 に答える 2

5

billsArrayで、削除されている対応するオブジェクトを確認して削除します。

[billsArray removeObjectAtIndex:indexPath.row];

出力からのヒントは次のとおりです。

更新後の既存のセクションに含まれる行数(4)は、更新前のそのセクションに含まれる行数(4)に、そのセクションから挿入または削除された行数(0挿入)を加えたものと等しくなければなりません。 、1が削除されました)およびそのセクションに出入りする行の数のプラスまたはマイナス

つまり、UITableViewはほとんど次のように言っています。

「わかりました。20行あります([billsArray count]から取得します。1行削除することになっています。つまり、合計19行にする必要があります。...しかし、代理人は20行にする必要があると言っています... Whhhattt dooo I dooo ??? ..... crash "--UITableView

したがって、行を削除するときは必ず、データ配列からオブジェクトを削除してください。または、行を追加する場合は、必ずそれをデータ配列に追加してください。

編集:(OP編集に応じて)。

あなたの問題があります。

self.billsArray = [resultsDictionary objectForKey:@"bills"]; 

これにより、読み取り専用の配列が作成されます。

あなたがする必要があるのはこれです:

self.billsArray = [[NSMutableArray alloc] initWithArray:[resultsDictionary objectForKey:@"bills"]];

または

self.billsArray = [NSMutableArray arrayWithArray:[resultsDictionary objectForKey:@"bills"]];

または、次のことを行うことができます(クリーンな方法ではありません):

NSMutableArray *temp = [resultsDictionary objectForKey:@"bills"];
self.billsArray = [temp mutableCopy];
于 2012-08-02T19:58:13.763 に答える
0

テーブルにセクションが1つしかない場合[billsArray removeObjectAtIndex:[indexPath row]]は、billsArrayが。NSMutableArrayではなく、であると仮定して、メソッドのどこかで呼び出すことができますNSArray。そうでない場合は、1つに変更するか、その内容を新しいNSMutableArrayにコピーして、その配列をテーブルデータソースとして使用できます。

于 2012-08-02T19:58:02.513 に答える