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

Один файл xib с несколькими "файловыми владельцами"

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

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

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

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

4b9b3361

Ответ 1

Владелец файла nib строго не соблюдается. Вместо этого он используется только для определения доступных выходов и действий и для установки привязок в Interface Builder. Вы можете загрузить нить с любым объектом в качестве владельца файла независимо от класса, установленного в файле nib. Когда загружается nib, он отправляет сообщения владельцу файла, чтобы восстановить привязки. Если фактический объект File Owner не распознает эти селекторы, вы вызываете исключение "непризнанного селектора". Это означает, что если ваш nib связывает некоторые UITableViewCell с "ячейкой" своего файлового владельца, тогда любой объект с свойством "cell" может загрузить этот nib. Вам просто нужно быть осторожным, чтобы не использовать это поведение для отправки непризнанного селектора или неожиданного класса выпуска.

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

Ответ 2

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

Ответ 3

"Общий" суперкласс как владелец файла не всегда является хорошим решением. Помните, что вы всегда можете загрузить 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...

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