0

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を返す必要があることです。

私が疑問に思っているのは、これにアプローチするより良い方法があるかどうかだと思いますか?

4

1 に答える 1

1

テーブルビューが表示を更新している間は、テーブルビューを変更することはできません。テーブルビューを変更しない限り、deleteRowsAtIndexパスを呼び出す必要はありません。別のメソッドが必要です。イベントに応答し、テーブルビューのデータを変更するメソッドです(おそらく、begin / endUpdatesを呼び出して、行を追加または削除します)。-numberOfRowsInSectionは、バッキングデータを検査し、回答を返す必要があります。テーブルビューはこの時点で完全な更新を行っているため、テーブルビューで行を追加および削除しても、この時点では意味がありません。

于 2012-12-14T23:39:14.870 に答える