0

いくつかのセルを含む UITableView があり、そのうちのいくつか (まだアップロード中のファイル用のもの) には、UIActivityIndi​​cator と UIProgressView の両方があります。終了したファイルのアイコンは、(アクティビティ インジケーターの代わりに) 別のアイコンを使用し、進行状況ビューを非表示にします。

このテーブルは NSFetchedResultsController をデータ ソースとして使用しているため、データ モデルの更新を取得してコンテンツを更新します。

すべてがうまく機能します。ただし、問題はパフォーマンスです。reloadDataを呼び出すたびに、UIActivityIndi​​cators がちらつき、あまりスムーズではありません。nib ファイルからキャッシュしていますが、reloadDataは ProgressView の新しい進行状況 % を計算する必要があり、アップロードが完了した場合に非表示にする以外に、ActivityIndi​​cator では何もしません。

似たようなことを試したことのある人はいますか?回避策はありますか?

私は、プログレスビュー参照の配列を持ち、reloadData を呼び出す代わりにそれを使用することを考えていました..これが正しいアプローチであるかどうかはわかりません。

ありがとう、

フェルナンド

4

1 に答える 1

1

UITableViewを呼び出すreloadDataと、テーブル ビューのすべてのセルが完全に更新され、再構築され、再描画されます。古いものはすべて捨てられます。これは、UITableViewCellsのすべてのサブビューも削除され、再作成されることを意味します ( UIActivityIndi​​catorおよびUIProgressViewを含む)。更新により、これらのビューがちらつくか、おそらく開始状態に戻ります。UIActivityIndi​​catorのフレームを設定する方法がないため、進行状況の値を復元するという提案は単に不可能です。

代わりに、テーブルの完全な更新を必要としないように「更新」を設計する必要がありますか? たとえば、ビュー内のUITextFieldのテキストを変更する場合は、このテキスト フィールドにアクセスしてテキスト プロパティを設定するだけです (更新は必要ありません)。または、進行状況インジケーターを非表示にする場合は、適切なオブジェクト インスタンスに移動して、そのプロパティを設定できます。これが可能になるようにアプリを設計する必要があります。この方法で変更を行うと、セルを最初から再ロードする必要がなくなります。

この更新方法を使用すると、問題を修正できるという利点に加えて、パフォーマンスが大幅に向上するはずです。使用するには非常にコストがかかる方法であり、 UITableViewreloadData全体を最初から本当に再作成する必要がある場合にのみ使用する必要があります。

お役に立てれば。:)

于 2011-02-04T23:42:53.260 に答える