Какова цель использования UIViewController IBOutlet

Я нахожусь на этапе обучения программированию iOS. Я пытаюсь добавить NIB (называемый B) в другой NIB (называемый A). Для этого я добавил контроллер представления в A, который использует B NIB (используя имя NIB). Кроме того, в ViewController A я создал IBOutlet для хранения ViewController B. Наконец, в A я подключил IBOutlet к ViewController, ссылаясь на B.

Теперь я ожидаю, что при запуске проекта я увижу, что B загружается всякий раз, когда загружается A, но это не так. Чтобы достичь этого, я должен прагматически инициализировать B, используя initWithNibName в методе A viewDidLoad, и установить его в IBOutlet. Но эта часть не зависит от использования как IBOutlet в A, так и добавления ViewController в A, который ссылается на B. Другими словами, если бы я просто инициализировал B в viewDidLoad A без создания IBOutlet в A и без создания представления Объект контроллера в A, это сработало бы точно так же.

Итак, мой вопрос: какова цель использования IBOutlet для добавления пользовательских NIB View Controller?


person qtips    schedule 29.05.2011    source источник
comment
IBOutlet — это просто отметка для конструктора интерфейсов, также помните, что представления и связанные с ними перья лениво загружаются в какао-тач.   -  person kgutteridge    schedule 29.05.2011
comment
Если вы все еще изучаете основы, не пытайтесь встроить контроллер представления в другой контроллер представления. Сначала изучите основы. Получите хороший учебник для начинающих и прочитайте руководство для разработчиков.   -  person Rob van der Veer    schedule 26.07.2013


Ответы (2)


Тот факт, что у вас есть выход на виртуальный VC B в VC A, не означает, что представление VC B будет загружено автоматически. Если вы проверите выход VC B в VC A viewDidLoad, вы увидите, что есть адрес VC B, поэтому NIB загружается. Чтобы загрузить его представление, вы должны получить доступ к VCB.view и вызвать соответствующие методы в VCB следующим образом:

[self.bViewController setFrame:[self frame]];
    [self.bViewController viewDidLoad];
[self.bViewController viewWillAppear:NO];
[self.view addSubview:self.bViewController.view];
[self.bViewController viewDidAppear:NO];
person TheBlack    schedule 29.05.2011

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

Вы можете использовать метод uiviewcontroller's presentViewController:animated:completion: для загрузки bViewController's view hierarchy, и все методы, такие как viewDidAppear, viewDidLoad, viewWillAppear, будут вызываться автоматически, вам не нужно вызывать их вручную.

Вы найдете эту статью Злоупотребление UIViewControllers полезной.

person S.J    schedule 26.07.2013