Подтвердить что ты не робот

IOS 5 UITableViewCell пользовательский XIB aka "Я теряю рассудок?"

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

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

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

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

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

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

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

2) isKindOfClass (MyCustomCellClass) сообщает true

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

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

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

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

Pulled from Apple's iOS 5 documentation

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

enter image description here

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

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

Я ищу любые идеи.

изменить

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

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

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

4b9b3361

Ответ 1

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

С 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 file:

-(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];
}
...

EDIT: обновление для нового в iOS 5 Новое в iOS 5 - это возможность для UITableView сохранять xib для определенных идентификаторов повторного использования ячеек, а затем создавать новую ячейку этого определенного типа, если в очереди повторного использования нет.

Отъезд

– registerNib:forCellReuseIdentifier:

Затем, когда вы делаете

– dequeueReusableCellWithIdentifier:

Вы гарантированно получите UITableViewCell указанного типа. Это экономит ваше выполнение всего UINib.