6

Apple Docが言ったように、

行を再ロードすると、テーブル ビューはデータ ソースにその行の新しいセルを要求します。

UITableView と NSFETchedResultsController を組み合わせます。

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    if (self.tableView.isEditing) 
    {
        [self.tableView setEditing:NO animated:YES];
    }
    [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];

    [self updateTabItemBadge];
    [self.noDataView setHidden:![self isNoData]];

    WXINFO(@"controllerDidChangeContent");
}

上記の 2 つの関数の間に、ターゲット セルをリロードします。

ここに画像の説明を入力

    case NSFetchedResultsChangeUpdate: {
        if (indexPath) {
            [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
        }

ここに画像の説明を入力

が呼び出されたことを確認するために、Line1563 にブレークポイントを設定しましたreloadRowsAtIndexPathsが、その後、- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath呼び出されませんでした。

そのため、セルを更新できませんでした。

誰かが理由を教えてくれますか?ありがとう。

4

4 に答える 4

0

これは私が行った回避策ですが、うまくいきました。

 func tableView(_ tableView: UITableView, commit editingStyle:
    UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == UITableViewCellEditingStyle.delete {
            if itemDetailDict.count - 1 <= 0 {
                self.mainTable.beginUpdates()
                let cellOne = self.mainTable.cellForRow(at: indexPath)
                cellOne?.textLabel?.text = "There are no items."
                self.mainTable.reloadRows(at: [indexPath], with: .automatic)
                self.mainTable.endUpdates()
            } else {
                self.mainTable.beginUpdates()
                let removeKey = Array(itemDetailDict.keys)[indexPath.row]
                itemDetailDict.removeValue(forKey: removeKey)
                mainTable.deleteRows(at: [indexPath], with: .automatic)
                self.mainTable.endUpdates()
            }
        }
    }

基本的に行の削除機能では、ユーザーが行を削除できるようにしたかったのですが、1行しか残っていないときに、テーブルビューのセルにデフォルトのメッセージを表示したかったのです。

これを行うために、データソースを更新し、ディクショナリにデータがなくなったら、セルを更新してテキストを表示し、セルをリロードしてから、テーブルビューで endUpdating を呼び出しました。

これが役立つことを願っています。

于 2017-01-09T15:56:18.657 に答える
0

これを行うために私が見つけた唯一の信頼できる方法は、なし以外のアニメーションを使用することです。他のアニメーションが指定されている場合、リロードは正しく行われます。

于 2014-11-03T20:22:08.880 に答える