NSFetchedResultsController に裏打ちされたテーブルビューがあり、FRC からの結果がないときにカスタム セルを表示しようとしています。私が直面している問題は、BeginUpdates が numberOfRowsInSection をリコールすることです。ユーザーがプルを実行して更新できるように、(その場所に画像を表示するだけでなく) テーブルビューをアクティブに保ちたいと考えています。
コード:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if ([self.fetchedResultsController.fetchedObjects count] == 0) {
if (!specialCellShowing) {
specialCellShowing = TRUE;
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
}
return 1;
}
else {
if (specialCellShowing) {
specialCellShowing = FALSE;
[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
}
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
return [self.fetchedResultsController.fetchedObjects count];
}
}
問題は return 1 です。声明。numberOfRowsInSection が初めて呼び出されたときに、specialCellShowing = TRUE が設定され、更新が開始され、numberOfRowsInSection が呼び出されます。メソッドの begin updates インスタンスは、specialCellShowing が true であることを確認し、1 を返して終了します。ここで挿入呼び出しが行われ、endUpdates でクラッシュが発生します。これは、tableview が、テーブルに 1 つのセルがあり、1 つのセルが挿入され、1 つのセルが前にあると見なすためです。もう1つの問題は、numberOfRowsInSectionへの後続の呼び出しで、テーブルを台無しにせず、カスタムセルが1つあると言って返すだけであるため、1を返す必要があることです。
私が疑問に思っているのは、これにアプローチするより良い方法があるかどうかだと思いますか?