Ячейки UITableView с UIActivityIndicator и UIProgressView - PullRequest
0 голосов
/ 05 февраля 2011

У меня есть UITableView, который содержит несколько ячеек, и некоторые из них (те, что для файлов, которые все еще загружаются) имеют как UIActivityIndicator, так и UIProgressView.Те, которые для файлов, которые закончены, используют другой значок (вместо индикатора активности) и скрывают представление прогресса.

В этой таблице в качестве источника данных используется NSFetchedResultsController, поэтому я получаю обновления модели данных и обновляю содержимое.

Все работает просто отлично.Проблема, однако, заключается в производительности.Каждый раз, когда я вызываю reloadData , мои UIActivityIndicators мерцают, и это не очень плавно.Несмотря на то, что я кеширую из nib-файла, reloadData придется рассчитать новый% прогресса для ProgressView, и я ничего не делаю с ActivityIndicator, кроме как скрыть его, если загрузка завершена.

Кто-нибудь когда-нибудь пробовал что-то подобное?Есть ли обходной путь?

Я думал о том, чтобы иметь массив моих ссылок на обзор прогресса и использовать его вместо вызова reloadData ... не уверен, что это правильный подход.

Спасибо,

Фернандо

1 Ответ

1 голос
/ 05 февраля 2011

Когда вы вызываете reloadData в UITableView , все ячейки табличного представления полностью обновляются, собираются и перерисовываются. Все старые выброшены. Это означает, что все подпредставления UITableViewCells также удаляются и создаются заново (включая ваши UIActivityIndicator и UIProgressView ). При обновлении эти виды мерцают или, возможно, возвращаются в исходное состояние. Поскольку нет способа установить фрейм UIActivityIndicator , ваше предложение восстановить некоторое значение прогресса просто невозможно.

Вместо этого, возможно, вам следует попробовать и спроектировать свое «обновление», чтобы не требовать полного обновления таблицы? Например, если вы хотите изменить текст UITextField в представлении, вы можете просто получить доступ к этому текстовому полю и установить свойство текста (обновление не требуется). Или, если вы хотите скрыть свои индикаторы прогресса, вы можете зайти в соответствующие экземпляры объектов и установить их свойства. Вы должны разработать свое приложение так, чтобы это было возможно. Внесение изменений таким образом позволяет избежать перезагрузки ячеек с нуля.

Помимо преимущества исправления вашей проблемы, с помощью этого метода обновления, вы также должны увидеть значительное увеличение производительности. reloadData - это очень дорогой метод, и его следует использовать только в том случае, если абсолютно необходимо действительно воссоздать UITableView с нуля.

Надеюсь, это поможет. :)

...