Насколько я понимаю, вы хотите:
- Разработайте ячейку в IB, которую можно использовать в нескольких сценах раскадровки.
- Настройте уникальные сегменты раскадровки из этой ячейки, в зависимости от сцены, в которой находится ячейка.
К сожалению, в настоящее время нет способа сделать это. Чтобы понять, почему ваши предыдущие попытки не сработали, вам нужно больше узнать о том, как работают раскадровки и ячейки прототипов. (Если вам все равно, почему эти другие попытки не сработали, не стесняйтесь уходить. У меня нет для вас волшебных обходных путей, кроме как предложить вам сообщить об ошибке.)
Раскадровка, по сути, не намного больше, чем набор файлов .xib. Когда вы загружаете контроллер табличного представления, в котором есть несколько прототипных ячеек, из раскадровки, вот что происходит:
- Каждая ячейка-прототип - это собственное встроенное мини-перо. Поэтому, когда загружается контроллер табличного представления, он проходит через все перья и вызовы ячейки прототипа.
-[UITableView registerNib:forCellReuseIdentifier:]
.
- В табличном представлении контроллер запрашивает ячейки.
- Ты наверное звонишь
-[UITableView dequeueReusableCellWithIdentifier:]
Когда вы запрашиваете ячейку с заданным идентификатором повторного использования, она проверяет, зарегистрирован ли у нее nib. Если это так, он создает экземпляр этой ячейки. Это состоит из следующих шагов:
- Посмотрите на класс ячейки, как определено в кончике ячейки. Вызов
[[CellClass alloc] initWithCoder:]
.
-initWithCoder:
Метод проходит и добавляет подпанели и наборы свойств , которые были определены в бобах. ( IBOutlet
Скорее всего, здесь тоже подключили, хотя я этого не проверял; это может случиться в -awakeFromNib
)
Вы настраиваете свою ячейку так, как хотите.
Здесь важно отметить, что существует различие между классом ячейки и ее внешним видом . Вы можете создать две отдельные ячейки-прототипы одного и того же класса, но их подпредставления будут совершенно разными. На самом деле, если вы используете UITableViewCell
стили по умолчанию , это именно то, что происходит. Например, стиль "Default" и стиль "Subtitle" представлены одним и тем же UITableViewCell
классом.
Это важно : класс ячейки не имеет взаимно-однозначного отношения с определенной иерархией представления . Иерархия представления полностью определяется тем, что находится в ячейке прототипа, которая была зарегистрирована этим конкретным контроллером.
Также обратите внимание, что идентификатор повторного использования ячейки не был зарегистрирован в каком-то глобальном диспансере сотовой связи. Идентификатор повторного использования используется только в контексте одного UITableView
экземпляра.
Учитывая эту информацию, давайте посмотрим, что произошло в ваших вышеупомянутых попытках.
В Контроллере # 1 добавлена ячейка прототипа, установлен класс для моего подкласса UITableViewCell, установлен идентификатор повторного использования, добавлены метки и подключены их к выходам класса. В Controller # 2 добавили пустую ячейку прототипа, установили для нее тот же класс и повторно использовали id, как и раньше. Когда он выполняется, метки никогда не появляются, когда ячейки отображаются в контроллере # 2. Прекрасно работает в контроллере № 1.
Это ожидается. Хотя обе ячейки имели один и тот же класс, иерархия представлений, которая была передана в ячейку контроллера № 2, была полностью лишена подпредставлений. Таким образом, вы получили пустую ячейку, которая является именно тем, что вы положили в прототип.
Разработан каждый тип ячейки в отдельном NIB и подключен к соответствующему классу ячейки. В раскадровку добавили пустую ячейку прототипа и задали ее класс и идентификатор повторного использования для ссылки на мой класс ячейки. В методах viewDidLoad контроллеров регистрировали эти файлы NIB для идентификатора повторного использования. Когда показано, клетки в обоих контроллерах были пусты, как в прототипе.
Опять же, это ожидается. Идентификатор повторного использования не является общим для сцен раскадровки или перьев, поэтому тот факт, что все эти отдельные ячейки имели одинаковый идентификатор повторного использования, был бессмысленным. Ячейка, которую вы возвращаете из табличного представления, будет иметь вид, соответствующий ячейке прототипа в этой сцене раскадровки.
Это решение было близко, хотя. Как вы заметили, вы можете просто программно позвонить -[UITableView registerNib:forCellReuseIdentifier:]
, передав UINib
содержащую ячейку, и вы вернетесь к той же самой ячейке. (Это не потому, что прототип «перекрывал» перо; вы просто не зарегистрировали перо в виде таблицы, поэтому оно все еще смотрело на перо, встроенное в раскадровку.) К сожалению, у этого подхода есть недостаток - нет способа подключить сегменты раскадровки к ячейке в отдельном кончике.
Держал прототипы в обоих контроллерах пустыми и устанавливал класс и повторно использовал id для моего класса ячеек. Пользовательский интерфейс ячеек построен полностью в коде. Ячейки отлично работают во всех контроллерах.
Естественно. Надеюсь, это неудивительно.
Вот почему это не сработало. Вы можете создавать свои ячейки в виде отдельных перьев и использовать их в разных сценах; вы просто не можете подключить сегменты раскадровки к этим ячейкам. Надеюсь, однако, вы узнали что-то в процессе чтения этого.