web-dev-qa-db-ja.com

新しいデータでuitableviewをリロードするとちらつきが発生しました

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

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

コード:

[self.tableView reloadData];
18
trillions

ご想像のとおり、ちらつきは[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.
            }
        }
    }

EDIT:docs も同じことをお勧めします:

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

12
Moss

以下のコードは魅力のように私のために働きました!

Objective-C

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

Swift 4

UIView.performWithoutAnimation {
    self.tableView.reloadData()
    self.tableView.beginUpdates()
    self.tableView.endUpdates()
}
15
Shaunak
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:index] withRowAnimation:UITableViewRowAnimationNone];

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

テーブルから行を削除していますが、datasource..soからは削除していません。行は削除されていますが、データソースは、行が削除されていないことを指摘しています。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];
3
Shubhank

[self.tableView reloadData]の代わりに単にreloadSectionsメソッドを呼び出さないのはなぜですか。

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
3
Zoeb S

他のすべての回答で問題が解決しない場合に備えて、私の解決策を投稿します。

推定された高さestimatedSectionHeaderHeightまたはestimatedRowHeightまたは-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPathを使用し、セクションごとに動的行数を使用する場合(たとえば、拡張可能な2レベルのtableView)

これを使用するのをやめて、正しい高さを返す-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPathを実装する必要があります。

1
ooops

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

私はそれを取り外して私のために働いた。

1
NSPratik

私のプロジェクトで何が働いたのか:

UIView.PerformWithoutAnimation(() =>
{
tableView.ReloadData();
tableView.LayoutIfNeeded();
});

(それはc#xamarinにあります... Swiftと同じです)

0
gal danay

これをセルに追加しましたか?

cell.selected = YES;

あなたがそうであり、画面のちらつきを望まない場合、uはこれを追加する必要があります。

cell.selectionStyle = UITableViewCellSelectionStyleNone;

希望は役に立ちます。

0
刘俊利

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

0
Durgaprasad