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

IPhone - как использовать Storyboard с пользовательскими ячейками UITableView и CellWithIdentifier

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

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

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

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

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

Неужели мое ожидание API полностью неверно или я просто не нашел нужный API?

Любые идеи или рекомендации?

4b9b3361

Ответ 1

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

YourTableViewCellClass *cell = (YourTableViewCellClass*)[tableView dequeueReusableCellWithIdentifier:@"YourCellIdentifierStringDefinedInStoryBoard"];
// then set the properties for the class.
cell.labelTime = @"whatever";

Ответ 2

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

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

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

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

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

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

Ответ 3

Не будь дофуфом, каким я был.:)

Убедитесь, что вы установили значение Identifier в Attributes Inspector пользовательской ячейки. Установка идентификатора восстановления пользовательской ячейки в Identity Inspector - это неправильный способ, и именно это я сделал. Для меня главное лицо.

Ответ 4

Дополнительные сведения о том, как это сделать, используя методы, описанные mservidio и rob, см. в разделе "Проектирование наших собственных прототипных ячеек" в this учебник.