Пользовательская ячейка, созданная с помощью IB, скрывается после вызова reloadSections: withRowAnimation: - PullRequest
2 голосов
/ 28 ноября 2010

поэтому я следовал этому руководству ("Техника для статического содержимого строки"), чтобы создать свои собственные пользовательские UITableViewCell-s, которые будут содержать одно изображение.

Следующий код взят из моего tableView:cellForRowAtIndexPath: метода:

UIImageView *imageView = (UIImageView *)[imageViewCell viewWithTag:1];
imageView.image = [UIImage imageNamed:imageName];
cell = imageViewCell;
NSLog(@"%@", cell);
...
return cell;

imageViewCell относится к моей пользовательской ячейке, созданной в конструкторе интерфейсов. Как видите, я пытаюсь каждый раз менять изображение.

Все работает нормально, но если я использую reloadSections:withRowAnimation: в UITableView, эта ячейка исчезнет.

Вот вывод консоли:

<UITableViewCell: 0x9c68fe0; frame = (0 0; 302 215); autoresize = RM+BM; layer = <CALayer: 0x4b88110>>
<UITableViewCell: 0x9c68fe0; frame = (0 120; 320 102); autoresize = W; layer = <CALayer: 0x4b88110>>
<UITableViewCell: 0x9c68fe0; frame = (-320 120; 320 102); alpha = 0; autoresize = W; layer = <CALayer: 0x4b88110>>
<UITableViewCell: 0x9c68fe0; frame = (-320 121; 320 105); alpha = 0; autoresize = W; layer = <CALayer: 0x4b88110>>
<UITableViewCell: 0x9c68fe0; frame = (-320 120; 320 111); alpha = 0; autoresize = W; layer = <CALayer: 0x4b88110>>

Так что, как вы можете видеть, его фрейм и альфа изменяются на странные значения и остаются такими же.

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

Как мне сбросить его атрибуты, чтобы он снова стал видимым? Я нашел метод с именем prepareForReuse, но он не сработал. Мне нужно что-то, что сбросило бы альфа и фрейм, чтобы оно появилось снова.


Раствор с загрузочным наконечником каждый раз

Чтобы быть более понятным в моем первом подходе: я создал ячейку табличного представления в кончике контроллера представления. Я настроил розетку, чтобы использовать ее в tableView:cellForRowAtIndexPath:.

Так как атрибуты ячейки были испорчены после анимации, я подумал, что воссоздание этой ячейки определенно поможет. Проблема была в том, что мое перо было загружено только один раз, и я (до сих пор) не знаю, как сделать что-то вроде повторной инициализации в представлении, которое было инициализировано файлом кончика.

Поэтому я решил создать новый файл пера и загружать его каждый раз. Это не совсем то, что я искал, но это работает. Вот как выглядит код, он очень прост:

[[NSBundle mainBundle] loadNibNamed:@"TestTableCell" owner:self options:nil];
UIImageView *imageView = (UIImageView *)[imageViewCell viewWithTag:1];
imageView.image = [UIImage imageNamed:imageName];
cell = imageViewCell;
imageViewCell = nil; // imageViewCell is still an outlet and setting
                     // it to nil makes the nib load it again the next
                     // time - so I'm sure I'll get a new instance.
cell.selectionStyle = UITableViewCellSelectionStyleNone;

Ответы [ 2 ]

3 голосов
/ 09 июня 2012

Использование reloadSections:withRowAnimation: с UITableViewRowAnimationNone фактически решает проблему для меня, и все равно показывает анимацию при добавлении / удалении ячеек из раздела.

Я все еще верю, что это ошибка в UIKit.

0 голосов
/ 28 ноября 2010

Ячейка исчезает, потому что что-то меняет свой фрейм так, что оно в конечном итоге вытягивается за пределы экрана.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...