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

UITableView registerNib: forCellReuseIdentifier:

Я видел, что это использовалось в видео WWDC, но только очень кратко. Они не входили в создание фактического файла xib.

У меня есть подкласс UITableViewCell под названием MyCustomCell. В этом я имею несколько свойств UILabels, UIImageViews и т.д.... все настроены как IBOutlets.

Теперь, в моем файле xib...

Что я установил в качестве владельца файла? Где я могу ссылаться на свой класс MyCustomCell, это владелец файла?

Как только я установил владельца файла, как мне связать его с корневым представлением xib?

Я пробовал несколько настроек, но я все время получаю ошибки при использовании.

О, код, который я использую для регистрации, это...

self.cellNib = [UINib nibWithNibName:@"MyCustomCell" bundle:nil];
[self.tableView registerNib:self.cellNib forCellReuseIdentifier:@"CustomCell"];

Спасибо

4b9b3361

Ответ 1

Обычно вам не нужно беспокоиться о владельце файла в этом случае, потому что, когда tableView создает экземпляр ячейки из предоставленного/связанного UINib вместе с reuseIdentifier. Он будет загружать все объекты верхнего уровня в nib, а использовать только первый объект верхнего уровня, который имеет класс UITableViewCell (или, может быть, только первый объект верхнего уровня, независимо от класс, но в общем случае у вас есть только UITableViewCell в вашем XIB - без учета File Owner и First Responder, которые являются только "прокси" ).

Фактически, tableView попытается удалить ячейку из ячейки, и если она не найдет повторно используемую, она создаст новую, используя предоставленный UINib. Это будет нечто похожее на это:

NSArray* topLevelObjects = [self.cellNib instantiateWithOwner:nil options:0];
cell = [topLevelObjects objectAtIndex:0];

(Это, конечно, упрощенная версия, чтобы показать эту идею, я не знаю, называет ли она эти точные строки, но она должна быть довольно близкой)

Итак, File Owner не используется в этом конкретном случае, и вам нужно только разместить простой пользовательский UITableViewCell как единственный объект верхнего уровня вашего XIB файла рядом с существующим File Owner anf First Responder (опять же, это только "прокси" / "Ссылки на внешние объекты" и не будут созданы и не будут частью объектов верхнего уровня возвращается instantiateWithOwner:options:).


Если он все еще не работает:

  • Убедитесь, что вы правильно заполнили reuseIdentifier вашего UITableViewCell в IB (на панели Object Inspector справа после того, как вы выбрали ячейку в IB), и использовали точно такое же значение для этого свойства reuseIdentifier в IB, которое вы используете в своем коде.
  • Если вам еще не повезло, предоставьте дополнительную информацию, особенно, какую ошибку, сообщение журнала или исключение вы имеете.

Ответ 2

Я нашел, что код, заданный в вопросе, прекрасен, но вы не можете ссылаться на self.tableView в методе init, если используете раскадровки. Там некоторые обсуждение об этом в другом вопросе.

Итак, первая строка находится в init:

self.cellNib = [UINib nibWithNibName:@"MyCustomCell" bundle:nil];

Но эта строка должна идти в viewDidLoad или аналогичной:

[self.tableView registerNib:self.cellNib forCellReuseIdentifier:@"CustomCell"];

Это исправляет мою загадочную ошибку, например. "*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle <Foo.app> (loaded)' with name 'Ogf-Sj-1ej-view-bBf-Ti-Dda''"

И да, я делаю что-то очень похожее на совок из раскадровки и размещаю их в xibs для повторного использования через контроллеры представлений!

Ответ 3

В дополнение к ответу от "AliSoftware" Обратите внимание, что наименее очевидным здесь является то, что UITableViewCell должен быть Root View * ВЫШЕ * даже UIView. По умолчанию, когда я выбрал новый файл IB, он создает UIView. Поэтому удаление UIView помогает. Спасибо.

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