iPhone - как использовать раскадровку с пользовательскими ячейками UITableView и CellWithIdentifier - PullRequest
13 голосов
/ 26 января 2012

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

Хороший пример стандартной ячейки связан здесь при переполнении стека: iPhone - использование dequeueReusableCellWithIdentifier

Вместо связанного подхода использования [[text textLabel] »я хочу использовать свои собственные метки, кнопки и изображения в верхней части каждой строки. Поэтому я создал несколько прототипных ячеек / строк и присвоил им идентификаторы (используя раскадровку).

Теперь: каков самый умный способ доступа к "пользовательским" элементам управления / меткам каждой строки? Я пытался найти доступ к ним по идентификатору, но ничего не нашел. Я думал, что это должно работать по следующим направлениям:

[[[cell subviews] getObjectByID:@"labelTime"] setText:@"Whatever"];

Является ли мое ожидание API совершенно неправильным или я просто не нашел подходящий API?

Есть идеи или рекомендации?

Ответы [ 4 ]

31 голосов
/ 26 января 2012

Для каждого нового пользовательского UITableViewCell, который вы создаете в раскадровке, вы захотите создать новый файл класса, который реализует UITableViewCell для ссылки на него.Обязательно сопоставьте все элементы управления в новой ячейке, которые вы выложили в раскадровке, со свойствами экземпляра.Тогда вы просто будете использовать его при снятии очереди, как обычно:

YourTableViewCellClass *cell = (YourTableViewCellClass*)[tableView dequeueReusableCellWithIdentifier:@"YourCellIdentifierStringDefinedInStoryBoard"];
// then set the properties for the class.
cell.labelTime = @"whatever";
8 голосов
/ 26 января 2012

Есть два способа добраться до ваших пользовательских подпредставлений.Более простой способ - использование тегов.Каждое представление имеет свойство tag, которое является целым числом.Вы можете установить тег в кончике, и установить или получить его в коде.Вы можете искать дерево представлений с данным тегом, отправив viewWithTag: в корень дерева.Так, например, вы могли бы дать вашему labelTime представлению тег 57, а в вашем коде вы бы нашли такое представление:

UILabel *label = (UILabel *)[cell viewWithTag:57];

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

Другой способ - создать собственный подкласс UITableViewCell со свойством IBOutlet для каждого пользовательского подпредставления.Вы можете подключить выходы к подпредставлениям в кончике и получить доступ к подпредставлениям через свойства в вашем коде:

MyTableViewCell *myCell = (MyTableViewCell *)cell;
UILabel *label = cell.labelTime;

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

6 голосов
/ 02 мая 2013

Не будь таким глупым, как я. :)

Убедитесь, что вы установили значение Идентификатор в Инспекторе атрибутов пользовательской ячейки. Установка Restoration ID пользовательской ячейки в Identity Inspector - неправильный путь, и именно это я и сделал. Главный лицевой щиток для себя.

0 голосов
/ 04 ноября 2013

Более подробную информацию о том, как это сделать, используя методы, описанные mservidio и rob, можно найти в разделе «Проектирование наших собственных прототипных ячеек» в этого урока .

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