24

無限スクロール機能を追加したところ、uitableview をリロードするたびにビューがちらつくことに気付きました..この時点でちらつきを修正する方法がわかりません。助けてください、ありがとう!

非常によく似た質問を見ましたが、解決策はありません。著者が投稿したものを試しましたが、うまくいきません:「親ビューからテーブルビューを削除し、データをリロードし、テーブルビューを親ビューに戻します」( UITableView reloadData - ちらつきを止める方法)

コード:

[self.tableView reloadData];
4

9 に答える 9

24

以下のコードは私にとって魅力的でした!

Objective-C

[UIView performWithoutAnimation:^{
   [self.tableview reloadData];
   [self.tableview beginUpdates];
   [self.tableview endUpdates];
}];

スイフト4

UIView.performWithoutAnimation {
    self.tableView.reloadData()
    self.tableView.beginUpdates()
    self.tableView.endUpdates()
}
于 2016-06-07T12:55:42.403 に答える
14

ご想像のとおり、ちらつきは [self.tableView reloadData]; を呼び出すことによって発生します。特に iOS 5.x デバイスでは、迅速かつ繰り返し発生します。ただし、テーブル全体を再読み込みするのではなく、テーブルの表示セル内のビューだけを更新したい場合があります。

ファイルのダウンロード中に最新のダウンロード % を反映するようにテーブルの各セルを更新するとします。私の例では、[downloading:totalRead:totalExpected:] メソッドが呼び出されます。バイトがダウンロードされると、非常に急速に呼び出されます。

これはしてはいけないことです...少し更新するたびにテーブルをリロードします(この例では、開発者は「cellForRowAtIndexPath」または「willDisplayCell」メソッドに依存して、すべての表示セルの更新を実行できます):

    - (void)downloading:(PPFile *)file totalRead:(long long)read totalExpected:(long long)expected {
        // Bad! Causes flickering when rapidly executed:
        [self.tableView reloadData];
    }

以下はより良い解決策です。セルのビューを更新する必要がある場合は、テーブルから表示されているセルのみを取得してそのセルを見つけ、テーブルをリロードせずにそのセルのビューを直接更新します。

    - (void)downloading:(PPFile *)file totalRead:(long long)read totalExpected:(long long)expected {
        NSArray *cells = [self.tableView visibleCells];

        for(MYCellView *cell in cells) {
            if(cell.fileReference == file) {
                // Update your cell's view here.
            }
        }
    }

編集:ドキュメントは同じことを推奨しています:

このメソッドを呼び出すと、テーブル ビューはデータ ソースに指定されたセクションの新しいセルを要求します。テーブル ビューは、古いセルをアニメーション化するのと同じように、新しいセルの挿入をアニメーション化します。指定されたセクションの値が変更されていることをユーザーに警告する場合は、このメソッドを呼び出します。ただし、ユーザーに警告せずに指定したセクションのセルの値を変更したいだけの場合は、それらのセルを取得して新しい値を直接設定できます。

于 2013-09-07T12:27:35.150 に答える
3
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:index] withRowAnimation:UITableViewRowAnimationNone];

更新でテーブルの行を削除または追加するたびに、テーブル ビューがリロードされ、アニメーション化されたセルの位置に基づいてデータソースに行数が要求されます。

テーブルから行を削除していますが、データソースからではありません..行は削除されていますが、データソースはまだ行が削除されていないことを指摘しています..20個のオブジェクトがまだそこにあります。あなたのデータソースは次のようになります

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return MyDataModel.count; // 
}

そのため、データソースの新しいデータも削除または追加する必要があります..このようなもの

   NSIndexPath *index = [NSIndexPath indexPathForRow:i inSection:0];
   [MyDataModel removeObjectAtIndex:index.row];
   [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:index] withRowAnimation:UITableViewRowAnimationNone];
于 2013-03-04T08:04:29.750 に答える
3

[self.tableView reloadData]; の代わりに単に reloadSections メソッドを呼び出してみませんか。

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
于 2014-06-06T15:27:35.120 に答える
1

cellForRowAtIndexPathデリゲート メソッドを参照してください。フリックを引き起こす可能性のある操作を行っている可能性があります。私の場合、アニメーション付きの画像ビューの画像を設定していました。そのため、テーブルをリロードするたびに、そのアニメーションが原因でちらつきました。

私はそれを削除し、私のために働きました..

于 2016-05-19T10:31:45.193 に答える
0

y deleteRowsAtIndexを使用していますか?テーブルをリロードすると、すべてのテーブルデリゲートメソッドが呼び出されます。すべての行を削除してから再度リロードするには時間がかかると思います。リロードメソッドを使用して試してください。

于 2013-03-04T08:07:14.903 に答える