Как загрузить NIB внутри представления в другой NIB?

У меня есть два NIB

ParentViewController.xib
ChildViewController.xib

ParentViewController.xib содержит UIView и UIViewController. ChildViewController.xib содержит UIButton

Я хочу, чтобы ChildViewController.xib загружался в ParentViewController.xib UIView

Я сделал следующее:

  • Создано @property для UIView в ParentViewController
  • Подключенный владелец файла к UIView в ParentViewController
  • Установить UIViewController в свойстве Name объекта ParentViewController NIB для ChildViewController в построителе интерфейсов
  • Установить свойство представления ChildViewController в UIView в ParentViewController

Я надеялся, что это загрузит ChildViewController в мой UIView в ParentViewController, но не повезло.

Я получил следующее предупреждение, которое может быть виновником:

'View Controller (Child View)' has both its 'NIB Name' property set and its 'view' outlet connected. This configuration is not supported.

Я также добавил дополнительный код в ParentViewController viewDidLoad():

- (void)viewDidLoad {
    [super viewDidLoad];
    ChildViewController *childViewController = [[ChildViewController alloc]initWithNibName:@"ChildViewController" bundle:nil]; 
    childViewController.view = self.myView; 
}

Любые мысли о том, почему ChildViewController не загружается в UIView ParentViewController?

Ответ 1

Попробуйте это

[self.myview addSubview: childViewController.view];

вместо

childViewController.view = self.myView; 

Ответ 2

Альтернативой является создание "встроенного" представления (!) в Nib, скажем ChildView.xib, а затем его экземпляр в ParentViewController.xib (изменение класса в инспекторе идентификации). Нет необходимости программно [self.view addSubview:embeddedView] в методе управления родительским представлением -viewDidLoad.

Я написал, как мы вставляем настраиваемые Nibs внутри других Nibs в длинном блоге. Ключ переопределяет -awakeAfterUsingCoder: в классе ChildView, заменяя объект, загруженный из "родительского" Nib, загруженным из "дочернего" Nib.

Обратите внимание, что наш пользовательский подкласс UIView, а не UIViewController (см. Apple docs на пользовательских контроллерах просмотров: "Вы не должны использовать несколько настраиваемых контроллеров представлений для управления различными частями одной и той же иерархии представлений." )