Один xib-файл с несколькими "владельцем файла" - PullRequest
21 голосов
/ 01 мая 2011

У меня есть три различных UITableView, каждый в своем собственном представлении, доступ к которому осуществляется через вкладки.Все три таблицы в идеале должны использовать один и тот же пользовательский класс UITableViewCell и файл .xib.

Я начал с одной таблицы, установив класс .xib для своего пользовательского класса, а для владельца файла .xib - родительский UIViewController таблицы, который прекрасно работает.Весь пользовательский код, относящийся к представлению, находится в классе ячейки (фоновые изображения, основанные на свойстве, установленном контроллером, высота настраиваемой ячейки, основанная на количестве строк, которое требует метка, на основании свойства ячейки, установленного контроллером, и т. Д.).

Результат хорош: ячейка отвечает за все визуальное расположение и отвечает на действия пользователя над элементами управления ячейки, а контроллер представления отвечает за создание ячеек и настройку их данных.

Теперь, когда мне нужно повторно использовать ячейку в других таблицах, проблема в том, что у .xib пользовательской ячейки есть один владелец файла, является проблемой.Вместо дублирования .xib-файла, существует ли простой способ позволить нескольким контроллерам владеть им?

Ответы [ 3 ]

38 голосов
/ 01 мая 2011

Владелец файла пера строго не соблюдается. Вместо этого он используется только для определения доступных выходов и действий, а также для установки привязок в Интерфейсном Разработчике. Вы можете загрузить перо с любым объектом в качестве владельца файла независимо от класса, установленного в файле кончика. Когда перо загружается, оно отправляет сообщения Владельцу файла для восстановления привязок. Если фактический объект-владелец файла не распознает эти селекторы, вы вызовете исключение «нераспознанный селектор». Это означает, что если ваш кончик привязывает некоторую UITableViewCell к выходу «ячейки» своего владельца файла, то любой объект со свойством «ячейка» может загрузить этот кончик. Вам просто нужно быть осторожным, чтобы не использовать это поведение для отправки нераспознанного селектора или неожиданного класса розетки.

В вашем случае рассмотрите возможность создания отдельного подкласса UIViewController, который будет действовать как владелец файла вашего пера. Пусть каждый из ваших трех существующих контроллеров расширит этот подкласс контроллера представления. Таким образом, все они могут наследовать один и тот же набор свойств, ожидаемый файлом пера, и все безопасно загружать этот пиб, все же определяя свое собственное поведение.

4 голосов
/ 01 мая 2011

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

1 голос
/ 14 октября 2014

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

UIView *aView = [[NSBundle mainBundle] loadNibNamed:@"MyXibFile" owner:self options:nil]
//Search subviews by tag. Obviously you need to set the tag on your view in MyXibFile
UILabel *aLabel = (UILabel*)[aView viewWithTag:996]; 
UILabel *aTextField = (UITextField*)[aView viewWithTag:997]; 
aTextField.delegate = self;
//etc...

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

...