行を挿入および削除するUITableViewがあります。
10個の値の配列があり、すべての行を含むテーブルビューから始めると、テーブルは正常に表示されます。次に、[0、1、5]以外のすべてを除外したい場合。次に、インデックスパス[2、3、4、6、7、8、9]で行を削除するプロセスを実行し、返される行数は3です。セルレンダリングコードを変更する必要はありません。行を表示します:[0、1、5]。
ただし、すべてをフィルタリングした後、このテーブルに戻って、行[0、1、5]のテーブルを永続化からロードしたい場合は、問題が発生します。テーブルは行数:3でロードされ、セルをレンダリングします:[0、1、2]。
viewDidLoadで0行でテーブルを初期化してから、viewDidAppearでinsertRows:[0、1、5]を呼び出してみましたが、これにより例外がスローされます。
***-[UITableView _endCellAnimationsWithContext:]、/ SourceCache / UIKit_Sim / UIKit-2380.17 / UITableView.m:909でのアサーションの失敗
そして、viewDidLoadで、行数が0を出力し、このエラーがスローされる直前に、出力される行数が3であることを確認しました。
編集代わりに[0、1、2]を挿入すると、機能します...しかし再び...最終的には[0、1、5]が表示される必要があります。
-(void)viewDidAppear:(BOOL)アニメーション
{{
[super viewDidAppear:animated];
NSArray * initialize_indeces = @ [[NSIndexPath indexPathForRow:0 inSection:0]、[NSIndexPath indexPathForRow:1 inSection:0]、[NSIndexPath indexPathForRow:5 inSection:0]];
[self.userDataTable insertRowsAtIndexPaths:initializing_indeces withRowAnimation:UITableViewRowAnimationAutomatic];
}
-(int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{{
//異なるブール値を使用しますが、要点は次のとおりです。
if(viewDidLoad)
0を返します。
if(viewDidAppear ||フィルター処理済み)
3を返します。
if(拡張)
10を返します。
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{{
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@ "CELL"];
if(!cell){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault restartIdentifier:@ "CELL"];
}
[cell.textLabel setText:[NSString stringWithFormat:@ "%i"、indexPath.row]];
セルを返します。
}