行を挿入および削除する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]]; セルを返します。 }