iOS 5 UITableViewCell пользовательский XIB, также известный как «Я схожу с ума?» - PullRequest
12 голосов
/ 24 января 2012

Хорошо.Я сделал больше пользовательских UITableViewCells, чем я могу сосчитать за последние три года.

Затем приходит iOS 5, и я только что получил проект на своем столе, где мне нужно сделать еще немного.

Таким образом, как я обычно это делал, я делал пользовательский XIB, перетаскивал UITableViewCell на холст, вставлял свои элементы управления, устанавливал пользовательский класс, выполнял связывание ... затем загружал экземпляр кода в код с помощью циклачерез объекты после распаковки XIB.

Делал это так много раз, что у меня была единственная функция Category для обработки всего этого.

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

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

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

2) isKindOfClass (MyCustomCellClass) сообщает значение true

3) Методы-установщики в пользовательском классе ячеек работают, объектные указатели для заданных значений И пользовательские метки UILabel и все такие отчеты, как не ноль, означают, что ячейка фактически создается и должным образом создается из XIB

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

Насколько я понимаю, что-то затеняет представление контента по умолчанию или иным образом пользовательские элементы управленияЯ создаю, что больше не присваиваюсь contentView ячейки (как раньше), а просто выбрасываю в космическое пространство.

Например, в iOS 4 XIB я использовал дляэто можно увидеть при создании пользовательской ячейки (взято из документации Apple iOS 5):

Pulled from Apple's iOS 5 documentation

Но на данный момент это то, что я вижу, когда делаю то же самое в iOS 5XIB

enter image description here

Итак, обратите внимание, что это больше явно не отображает эту маленькую пунктирную линию Content View.

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

Я вообще ищу какие-либо идеи.

edit

Код для загрузки XIB

if (cell == nil)
{
    [[NSBundle mainBundle] loadNibNamed:@"XCCodeViewCell" owner:self options:nil];
    cell = codeCell;
    self.codeCell = nil;
}

Это то, что происходит после упрощения на основе новых рекомендаций Apple iOS 5.XIB имеет своего владельца, правильно настроенного на класс «self», и codeCell правильно связан с ячейкой с правильным классом и идентификатором.

1 Ответ

24 голосов
/ 25 января 2012

Ух, этот тест занял у меня некоторое время, но я думаю, что у меня есть для вас ответ ...

С Xcode4 в конструкторе интерфейсов они добавили возможность статической настройки tableViewCells в конструкторе интерфейсов.,Это здорово, когда вы хотите создать табличные представления, которые не будут меняться, и вы не хотите писать их в коде.Чтобы облегчить это, они установили возможность устанавливать стиль tableViewCell в IB и видеть, как это выглядит.Когда вы создаете свою собственную ячейку со своими собственными подпредставлениями, вы выбираете «Custom».

С разработками для iOS 5 я обнаружил следующее;Когда я загружаю ячейку из xib, а затем программно устанавливаю textLabel.text или другой атрибут одного из стандартных стилей ячеек, создается впечатление, что tableViewCell генерирует это стандартное представление с метками по умолчанию в нем и накладывает на него ваше настраиваемое представление.Таким образом, чтобы сохранить ваши пользовательские подпредставления ячеек, вам не нужно обращаться к каким-либо стандартным свойствам tableCell.

Отлично.

Также в iOS 4 появилось новое UINib.Вы должны использовать UINib для загрузки tableViewCells из xibs, так как она кэшируется и работает быстрее (тем лучше для прокрутки tableView).Код ARC выглядит следующим образом:

заголовок:

@property (nonatomic, strong) UINib * tableCellLoader;

.m файл:

-(void)viewDidLoad{
    [super viewDidLoad];
    self.tableCellLoader = [UINib nibWithNibName:@"MyTableViewCell" bundle:nil];
}

Затем в tableView: cellForRowAtIndexPath:

...
if (cell == nil) {
    cell = [[self.tableCellLoader instantiateWithOwner:self options:nil] objectAtIndex:0];
}
...

РЕДАКТИРОВАТЬ: обновление для новых в iOS 5 Новое в iOS 5 - это возможность UITableView сохранять xibs для определенных идентификаторов повторного использования ячеек, а затем создавать новую ячейку этого определенного типа, если в очереди на повторное использование их нет.

Проверьте

– registerNib:forCellReuseIdentifier:

Тогда, когда вы сделаете

– dequeueReusableCellWithIdentifier:

Вы гарантированно получите UITableViewCell указанного типа обратно.Это спасает вас от всего, что вы делаете UINib.

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