0

UITableView のセクションの最後の行を削除すると、このエラーが発生します。

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

配列のカウントが 0 より大きい場合、テーブルには 3 つのセクションがあります (ユーザーは自分で場所を追加できます)。配列が 0 の場合、テーブルには 2 つのセクションしか含まれていません。ここに問題があると思いますが、それを理解することはできません。

セルを削除して配列を更新するためのコードは次のとおりです。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell* delCell = [tableView cellForRowAtIndexPath:indexPath];
    delName = delCell.textLabel.text;
    [self deleteLocation];
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

-(void)deleteLocation {


    NSLog(@"Name = %@",delName);

    NSUserDefaults *customLocations = [NSUserDefaults standardUserDefaults];
    NSUserDefaults *sharedPref = [NSUserDefaults standardUserDefaults];


    [customLocations removeObjectForKey:delName];
    [customLocations synchronize];

    [customLoc removeObject:delName];
    saveCustomLoc = [NSArray arrayWithArray:customLoc];

    [sharedPref setObject:saveCustomLoc forKey:@"CustomLocations"];
    [sharedPref synchronize];

    NSLog(@"%@",saveCustomLoc);
    NSLog(@"%lu",(unsigned long)[saveCustomLoc count]);

    [self showAlert];



}

- (void) showAlert {

    UIAlertView *alert = [[UIAlertView alloc]

                          initWithTitle:@"Location Deleted"
                          message:@"The location has been deleted"
                          delegate:nil
                          cancelButtonTitle:@"Ok"
                          otherButtonTitles:nil];

    [alert show];

}

これは、最後のセルまでうまく機能します。

私のテーブルのセットアップ方法の例は次のとおりです。

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

{
    if ([customLoc count] == 0) {   // If there is no data in the custom locations array the don't include that section
        if (section == 0) {
            return [serverSelection count];

        }
        else {
            return [qServerSelection count];

        }
    }
    else {
        if (section == 0) {
            return [customLoc count];

        }
        else if (section == 1) {
            return [serverSelection count];

        }
        else {
            return [qServerSelection count];
        }
    }

したがって、見出し/行数/セクション数などは、配列の内容に依存します。セルが削除されているセクションが消える (セクション 1 がセクション 0 に移動すると、突然 4 つのセルが表示される) という事実が問題を引き起こしていると思います。

これを回避する方法はありますか?

4

1 に答える 1

0

これをさらに調べたところ、(Apple フォーラムのメンバーの助けを借りて) セクションから最後の行を削除するときに、セクションも明示的に削除する必要があることがわかりました。

以下に示すように、最初と最後にテーブル更新コードも追加しました。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView beginUpdates];

    UITableViewCell* delCell = [tableView cellForRowAtIndexPath:indexPath];
    delName = delCell.textLabel.text;
    [self deleteLocation];
    if ([customLoc count] == 0) {
        [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationTop];
    }
    else {
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }

    [tableView endUpdates];

}

したがって、配列が 0 の場合 (つまり、最後の行が削除されている場合)、セクション自体が削除されます。

于 2013-03-17T06:00:48.897 に答える