Загадочная проблема с зависанием UITableView

Я новичок в разработке iPhone. Я работаю над табличным представлением (подкласс UITableView по умолчанию), который содержит сложные настраиваемые ячейки с несколькими подпредставлениями и элементами управления. Прокрутка не очень плавная, но я пока оставлю это.

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

Если в таблице очень мало строк, скажем, 5 или 6, она никогда не застревает. Пользовательский класс ячеек, который я использовал, взят из приведенного здесь примера: http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/

Кто-нибудь может дать подсказку или решение этой проблемы? Заранее спасибо.


person Tong Liu    schedule 27.08.2009    source источник
comment
Это происходит в симуляторе или на устройстве? Симулятор довольно часто застревает в табличных представлениях. Если это устройство, игнорируйте этот комментарий;)   -  person Jab    schedule 27.08.2009
comment
Это происходит в симуляторе и на устройстве. В симуляторе таблица просто перестает прокручиваться, и прокрутка исчезает. На устройстве скроллер не пропадает.   -  person Tong Liu    schedule 28.08.2009


Ответы (3)


  1. Ячейки таблицы создаются только при необходимости, то есть когда они появляются в поле зрения, и обычно выгружаются и освобождаются, когда они выходят из поля зрения.
  2. Вставьте NSLog( @"Cell loading" ); в код создания ячейки и проверьте консоль, чтобы увидеть, как это происходит при прокрутке.
  3. Вы используете кеширование? В документации показано, как можно кэшировать ячейки таблицы для повышения производительности. Что еще вы делаете, когда создаете table cells? Если есть какие-либо замедления производительности, у вас, вероятно, не должно происходить этого при создании ячеек.
  4. Что я делаю, так это генерирую весь свой контент до загрузки таблицы, а после создания ячеек весь этот контент просто помещается в представление.
  5. Любой вид рисования резко снизит производительность, особенно если вы используете прозрачность.
person Bjorn    schedule 27.08.2009
comment
Спасибо за полезный совет, но пока я не собираюсь уделять много внимания производительности. Я думаю, что решил проблему зависания скроллера, используя шаблон UITableViewController, сгенерированный XCode, вместо пользовательского UIViewController. Протестировали непрерывную прокрутку в течение нескольких минут, и прокрутка никогда не зависала. - person Tong Liu; 28.08.2009

Для потомков и действителен только в том случае, если вы используете Unity-iphone: эта проблема сводила меня с ума, и я исправил ее с помощью предложения в этом сообщении:

http://forum.unity3d.com/threads/113815-quot-Sticky-quot-scrolling-in-UITableView-and-UIScrollView-when-interfacing-Unity-and-Obj-C

Изменение флага препроцессора на

#define USE_DISPLAY_LINK_IF_AVAILABLE 0

дал этому вопросу счастливый конец.

person Cesar    schedule 10.08.2012

Я бы посмотрел на ваш метод cellForRowAtIndexPath - на предмет нескольких возможных проблем.

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

Если вы опубликуете свой код для этого метода, мы сможем дать вам несколько подсказок относительно того, что могло его вызвать.

person paulthenerd    schedule 27.08.2009
comment
Возможно, что-то не так с моим пользовательским UIViewController, который обрабатывает методы делегирования таблицы. В любом случае, я (думаю), я решил проблему, используя шаблон UITableViewController, созданный XCode. Спасибо. - person Tong Liu; 28.08.2009