4

次のコード例があります。

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

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

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

if ([nameSection count] == 0)
{
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
      [tableView beginUpdates];
      [indexKeys removeObjectAtIndex:section];
      [tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];
      [tableView endUpdates];
}

順序に注意してください....最初の例では、最初に配列からオブジェクトを削除し、次にテーブルビューから行を削除しています。

2 番目の例では、テーブルビューから行を削除し、次に配列からセクションを削除し、次にテーブルビューからセクションを削除しています。

これは物事を行う正しい順序ですか?それとも、最初に UI から削除してから配列を削除する必要がありますか?

私が尋ねる理由は、私が再現できないように見えるこれらのクラッシュを報告している何人かのユーザーを得ているからです:

NSInternalInconsistencyException - 無効な更新: セクション 1 の行数が無効です。更新 (0) 後の既存のセクションに含まれる行数は、更新前にそのセクションに含まれる行数と等しくなければなりません

このスタック トレースで:

1: libobjc.A.dylib  objc_exception_throw 32
2: CoreFoundation  [NSException raise:format:] 0
3: Foundation  -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] 90
4: UIKit  -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] 6042
5: UIKit  -[UITableView _updateRowsAtIndexPaths:updateAction:withRowAnimation:] 254
6: UIKit  -[UITableView deleteRowsAtIndexPaths:withRowAnimation:] 26
7: Movies  _mh_execute_header 253319
8: UIKit -[UITableView(UITableViewInternal) animateDeletionOfRowWithCell:] 84
9: CoreFoundation  -[NSObject performSelector:withObject:withObject:] 52
10: UIKit  -[UIApplication sendAction:to:from:forEvent:] 62
4

2 に答える 2

3

テーブルが編集モードになると、テーブル ビューはデータ ソースに各行を編集可能にするかどうかを尋ねます。tableView:canEditRowAtIndexPath: メソッドが実装されている場合、これは行ごとに順番に呼び出されます。

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0) {
        return NO;
    }
    return YES;
}

行を編集できるかどうかを確認すると、テーブル ビューはデリゲートに各行で使用する編集スタイルを尋ねます。

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewCellEditingStyleDelete;
}

[削除] ボタンがタップされると、tableView は tableView:commitEditingStyle:forRowAtIndexPath: メッセージをデータ ソースに送信します。次の 3 つのパラメーターを使用します。

1) tableView 自体への参照 (データ ソースが多数の tableView を区別する必要がある場合)。

2) タップされたばかりのコントロールの UITableViewCellEditingStyle — この場合は UITableViewCellEditingStyleDelete

3) 問題の行を特定する indexPath オブジェクト。

データ ソースが commitEditingStyle:forRowAtIndexPath: メッセージを受信すると、次の 2 つのことを行う必要があります。

1) テーブルの行で表されるオブジェクトを削除して、tableView のモデルを更新します。テーブル自体は単なるビューであり、実際にモデルからオブジェクトを削除しない限り、次にテーブルがリロードされたときにテーブルに再び表示されることに注意してください。

2) tableView:deleteRowsAtIndexPath:withRowAnimation: メッセージを tableView に送信して、テーブルの表示を更新します。この場合、Delete を扱っているため、削除されたセルが左にスライドしてアニメーション化され、その下のセルが上に移動してギャップが閉じます。

-(void)tableView:(UITableView *)tableView 
  commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
   forRowAtIndexPath:(NSIndexPath *)indexPath {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            [self.tableData removeObjectAtIndex:indexPath.row];
            NSArray *indexPathArray = [NSArray arrayWithObject:indexPath];
            [tableView deleteRowsAtIndexPaths:indexPathArray
                             withRowAnimation:UITableViewRowAnimationAutomatic];
        }
    }

さまざまなテーブル セルの挿入および削除アニメーションから選択できます。

  1. UITableViewRowAnimationFade - 行がフェードインおよびフェードアウトします。
  2. UITableViewRowAnimationRight - 挿入された行は右からスライドします。削除された行は右にスライドします。
  3. UITableViewRowAnimationLeft - 挿入された行は左からスライドします。削除された行は左にスライドします。
  4. UITableViewRowAnimationTop - 挿入された行は上の行の一番下から下にスライドします。削除された行は、上の行の一番下に向かってスライドします。
  5. UITableViewRowAnimationBottom - 挿入された行は下のセルの上から上にスライドします。削除された行は、上にスライドする下の行で覆われているように見えます。
  6. UITableViewRowAnimationNone - 挿入された行は単に表示されます。削除された行は単に消えます。
  7. UITableViewRowAnimationMiddle - セルは、アコーディオン スタイルの効果で挿入および削除されます。
  8. UITableViewRowAnimationAutomatic - tableView は適切なアニメーション スタイルを自動的に選択します (iOS 5 以降でのみ使用可能)。

テーブルの操作方法に関する優れた本はこちらです。

于 2013-06-07T17:35:15.583 に答える
3

最初にデータ モデルを更新する必要があります。そうしないと、正しい行数とセクション数についてテーブル ビューが混乱してしまいます。

于 2013-06-07T16:50:02.663 に答える