Загрузить представление из файла NIB из нескольких разных UIViewControllers

Я успешно загружал представление из файлов Nib, используя подход, найденный в этом сайт

[[NSBundle mainBundle] loadNibNamed:@"YourNibName" owner:self options:nil];

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


person Paulo Casaretto    schedule 19.08.2010    source источник


Ответы (3)


Я представлю два варианта:

  • Создайте класс NibLoader с одним @property (nonatomic, retain) IBOutlet id mainObject; и методом с именем loadNibNamed:bundle:). Затем выполните MyView * v = [[NibLoader loadNibNamed:"MyView" bundle:nil] mainObject];. (Ошибка доступа к свойствам GCC 4.0 означала, что [...].mainObject дважды вызывал [...]; это было исправлено в 4.2.)
  • Создайте @protocol MyNibOwner, у которого есть @property (nonatomic, retain) IBOutlet MyView * myView;, и измените класс владельца файла на id<MyNibLoader> или NSObject<MyNibLoader>.
person tc.    schedule 19.08.2010
comment
или UIViewController<MyNibLoader>, но это не позволяет представлениям загружать ваш перо как подпредставление в init. - person tc.; 19.08.2010
comment
Второе решение звучит идеально, но IB не принимает протокол после id. Установка его на id и сохранение неработающей ссылки сработало, но я полагаю, что это не очень безопасно. - person Paulo Casaretto; 20.08.2010
comment
Это странно, так как IBOutlet id<FooDelegate> delegate работает отлично (но, возможно, в этом случае он просто игнорирует протокол; это меня не удивит). Вы можете добавить фиктивный @interface MyNibOwnerHack:NSObject<MyNibOwner> для удобства InterfaceBuilder. - person tc.; 20.08.2010
comment
бессовестный плагин: я только что опубликовал хорошее дополнение к этому методу, которое оказалось очень полезным для меня на loudcoding.com/posts/ - person Paulo Casaretto; 30.03.2012
comment
@PauloCasaretto: Вы, вероятно, не хотите делать [self viewWithTag:0], так как IIRC 0 является тегом по умолчанию. Вы также должны быть слегка осторожны при повторном использовании идентификаторов тегов. - person tc.; 04.04.2012

Перо — это просто шаблон, вы можете загружать его снова и снова.

Если вы используете iOS4, вы можете взглянуть на UINib, который обеспечивает улучшенную производительность при повторной загрузке пера.

person Eiko    schedule 19.08.2010

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

person Dave DeLong    schedule 19.08.2010
comment
Угу, нет. Встраивание контроллеров представления в контроллеры представления неприемлемо, и если вам просто нужно представление, вам нужно сделать UIView * v = [[vc.view retain] autorelease]; vc.view = nil; return v;, иначе все будет вести себя странно (я забыл, что это за ошибка или какая версия ОС). - person tc.; 19.08.2010