2

UISwitch があり、2 つのテーブル ビューの状態を切り替えます。問題はクラッシュの原因となる高速スイッチングです。行の削除には時間がかかるためだと思います (cuz アニメーション)。いくつかのセルを追加し、ほぼ同時にそれらを削除しようとすると、クラッシュします。私に何ができる?どうしてもアニメーションが欲しいので、[self.tableView reloadData]では解決しません。

- (void)switchChangedInIndexPath:(NSIndexPath *)indexPath
{
    EBOrderFormCell *cell = (EBOrderFormCell *)[self.tableView cellForRowAtIndexPath:indexPath];
    BOOL on = cell.picker.on;
    if (indexPath.row == EBOrderFormTakeAway) {
        self.takeAway = on;
        [self takeAwayChanged];
    }
}

- (void)takeAwayChanged
{
    NSArray *notTakeAwayCells = [[NSArray alloc] initWithObjects:
                                    [NSIndexPath indexPathForRow:EBOrderFormStreet inSection:0],
                                    [NSIndexPath indexPathForRow:EBOrderFormHouseNumber inSection:0],
                                    [NSIndexPath indexPathForRow:EBOrderFormFlatNumber inSection:0],
                                    nil];
    NSArray *takeAwayCells = [[NSArray alloc] initWithObjects:
                              [NSIndexPath indexPathForRow:EBOrderFormCafe inSection:0],
                              nil];
    [self.tableView beginUpdates];
    if (self.takeAway) {
        [self.tableView insertRowsAtIndexPaths:takeAwayCells withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView deleteRowsAtIndexPaths:notTakeAwayCells withRowAnimation:UITableViewRowAnimationFade];
    } else {
        [self.tableView insertRowsAtIndexPaths:notTakeAwayCells withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView deleteRowsAtIndexPaths:takeAwayCells withRowAnimation:UITableViewRowAnimationFade];
    }
    [self.tableView endUpdates];
}

更新:次のコードで修正しました:

- (void)takeAwayChanged
{
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
}
4

1 に答える 1

2

通常、アニメーション中はユーザー インタラクションを無効にしますが、ユーザー インタラクションをオンに戻すタイミングを知るために完了ハンドラーが必要になるため (テーブル ビューのバッチ更新ではこれが提供されません)、バッチ更新をブロックして、テーブル ビューに攪拌を停止する機会を与えます。

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView beginUpdates];
        //...
        [self.tableView endUpdates];
    });

これを行うことで、バッチ更新の重複によるクラッシュを解決しました。ただし、問題を再現しようとしましたが、できませんでした。したがって、別の問題が発生する可能性があります。

それでも問題が解決しない場合は、TLIndexPathToolsを使用してテーブルを作成することを検討してください。バッチ更新を計算して実行し、非常に堅牢です。具体的には、設定サンプル プロジェクトを実行してみてください。「サウンド」スイッチのオンとオフを切り替えると、行がすばやく表示または非表示になり、クラッシュしません。

于 2013-07-09T02:22:32.330 に答える