2015-04-30 2 views
2

Я строю UIViewController с XIB. В этом XIB у меня есть заполнители (UIView объектов в XIB), в которых я размещаю другие виды, с других контроллеров вида. (Кстати, я мог бы также добавить эти представления напрямую, без заполнителей)Должен ли я использовать addChildViewController, когда я добавляю представление в другое представление (и оба эти представления контролируются контроллерами представлений)?

Я не собираюсь контролировать контроллер контейнера: я имею в виду, что это не UINavigationController. Это просто «обычный» контроллер вида. Представьте себе, например, что у меня есть небольшое подзаголовок, на мой взгляд, для логотипа «Facebook» и счетчика. Этот «просмотр facebook» прикрепляется к другому контроллеру представления, который вызывается, когда затрагивается «вид Facebook». Таким образом, «Контроллер Facebook» определенно должен быть @property моего «главного» контроллера.

В этой ситуации, должен ли я использовать addChildViewController: и весь механизм? Или нет?

Спасибо!

ответ

0

Вы можете создать экземпляр инсайдер ViewController, и просто добавить свое мнение (myInsiderViewController.view) на ваш основной ViewController:

[mainViewController.view addSubView:myInsiderViewController.view]; 
+0

Так что не нужен , кроме того, добавить 'myInsiderViewController' в качестве дочернего элемента' mainViewController'? – Colas

+0

Нет, вы этого не сделаете: ваш myInsiderViewController будет выпущен, но по мере того, как вы добавили его представление в mainViewController.view, его представление не будет выпущено, потому что оно сохраняется (принадлежит) mainController.view. –

+0

Но мне нужно сохранить (сильную) ссылку на контроллер. У меня есть сильная ссылка под названием 'myFacebookController'. В дополнение к этому, нужно ли использовать механизм parent/child. Это мой вопрос (см. Правки моих вопросов). – Colas

2

Да, вы должны. Поступая таким образом, содержащий контроллер представления передает правильные события жизненного цикла контроллера управления контроллерам дочерних представлений.

Вы говорите, что вы не строите контроллер контейнера, но вы есть. Добавление представления другого контроллера представления в другой контроллер представления - это определение контроллера представления контейнера.

См. Раздел «Реализация контроллера контейнера» в документах для UIViewController о правильной последовательности вызовов методов, которые вы должны выполнить. Это больше, чем просто позвонить addChildViewController.

4

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

NSArray* objects = [[UINib nibWithNibName: @"MyNib" bundle: nil] 
      instantiateWithOwner:nil options:nil]; 
UIView* v = (UIView*)[objects firstObject]; 

Но если вы используете UIViewController в сочетании с этим .xib файла по какой-то другой причины, например, чтобы сохранить его живым, так что кнопка внутри .xib может отправлять сообщения этого UIViewController, то абсолютно необходимо сделать правильные отношения между родителями и детьми, так как я описал в своей книге: http://www.apeth.com/iOSBook/ch19.html#_container_view_controllers

+0

Я надеялся, что мы доберемся до этого аспекта вашего предыдущего вопроса! – matt

+0

Да, но представьте себе, что мне нужен вид, но также и контроллер 'SubViewController'? Например, когда пользователь прикасается к кнопке, контроллер выполняет некоторые действия. В этом случае мне нужно, кроме того, добавить 'SubViewController' в качестве дочернего элемента' MainViewController'? – Colas

+0

Да. Нет другого правильного способа сохранить SubViewController живым и иметь представление в представлении MainViewController. Как вам сказали, это отношения родитель-ребенок _is_, и есть только один правильный способ сделать это. - Я изменил свой ответ, чтобы подчеркнуть этот момент. – matt

Смежные вопросы

 Смежные вопросы