3

配列の配列にリンクするデリゲート データ ソースを持つ複数のセクションを持つ TableView があります。配列の配列内の各配列は、独自のテーブル ビュー セクションです。正しく読み込まれ、編集ボタンが有効になっていますが、アプリを削除しようとすると、次のエラーでクラッシュします。

*** キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了します。理由: '無効な更新: セクションの数が無効です。更新後のテーブル ビューに含まれるセクションの数 (9) は、更新前のテーブル ビューに含まれるセクションの数 (10) に、挿入または削除されたセクションの数 (0 挿入、0削除されました)」

今、私はセクションを削除していないので、やや混乱しています。これが私のコードのサンプルです。このフォーラムを広範囲に検索しましたが、何が間違っていたのかわかりません。

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

// Calculate how many sections in the table view from the array or arrays

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView{

    AppDelegate *delegate = [[UIApplication sharedApplication]delegate];

    NSInteger sections = [delegate.packing.packingListArray count];

    return sections;
}

// Load the array and extract the count of items for each section

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    // For each array within the array of array count the items
    AppDelegate *delegate = [[UIApplication sharedApplication]delegate];
    NSArray *sectionContents = [delegate.packing.packingListArray objectAtIndex:section];
    NSInteger rows = [sectionContents count];

    return rows;
}

// Load the list into the table view

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // Set the cell identifier - using ID field thats been set in interface builder
    static NSString *CellIdentifier = @"DestinationCell";

    // Re-use existing cell?
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    // If no reusabled cells then create a new one
    if (cell == nil){
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Add the relevant packing list array from the array of arrays
    AppDelegate *delegate = [[UIApplication sharedApplication]delegate];
    NSArray *sectionContents = [delegate.packing.packingListArray objectAtIndex:[indexPath section]];
    NSString *contentForThisRow = [sectionContents objectAtIndex:[indexPath row]];

    cell.textLabel.text = contentForThisRow;



    // Return the formatted cell with the text it needs to display in the row
    return cell;
}

// Delete row from table and update data source array

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

    if (editingStyle ==UITableViewCellEditingStyleDelete) {


        [tableView beginUpdates];

        // Delete the item from the array
        AppDelegate *delegate = [[UIApplication sharedApplication]delegate];
        [delegate.packing.packingListArray  removeObjectAtIndex:indexPath.row];


        // Delete the row from the table view
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

        [tableView endUpdates];

    }


}

これは、おそらく複数のセクションを作成する配列の配列の複雑さと関係があると感じていますが、これを行うには何らかの方法が必要ですか?

この同じコードを何時間も見てきたので、助けていただければ幸いです。

4

1 に答える 1

3

私は最終的に問題を解決することができましたが、最終的にいくつかの問題がありました。それはすべて、配列または配列からアイテムを削除しようとしていた方法が原因でした。私が使用すべきだったコードは次のとおりです。

AppDelegate *delegate = [[UIApplication sharedApplication]delegate];
[[delegate.packing.packingListArray objectAtIndex:indexPath.section] removeObjectAtIndex:indexPath.row];

次に、配列を plist から構築したときに配列を定義する方法に問題がありました。これは、NSMutableArray として設定されていますが、NSArray に変換されていました。それで、その声明の最後に私は含めました。

........mutablecopy];

すべての問題が解決しました:)

于 2013-05-22T15:19:24.697 に答える