Вопрос по iphone, ios, objective-c, uiview – iPhone, как добавить представление контроллера представления к представлению другого контроллера представления?

3

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

Это не работает, потому что представление не заканчивает загрузку

<code>self.messageViewController = [[PopupMessagesViewController alloc] initWithNibName:@"PopupMessagesViewController" bundle:nil];
[self.view addSubview:self.messageViewController.view];
</code>

How can I add a UIView that a view controller creates from a nib to another view controller's view? Как я могу заставить такой вид загружаться перед его добавлением?

С какого метода вы вызываете это? viewDidLoad или init? Если вы звоните из init, self.view еще не создан. Kekoa

Ваш Ответ

3   ответа
2

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

Допустимые решения - использовать методы контроллера представления контейнера iOS 5 для добавления контроллера дочернего представления в качестве дочернего контроллера представления или иметь класс контроллера не-UIViewController, отвечающий за управление этим подпредставлением, если вам нужно инкапсулировать такое поведение.

Мне любопытно, можете ли вы указать мне, какие предположения это нарушает?
@ Кекоа, конечно, я пытался осветить это здесь;blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers Это предшествует поддержке контроллера дочерних представлений iOS 5, поэтому он не обсуждает это в качестве альтернативы, но если вы не используете эти методы, все, что я обсуждаю, по-прежнему применимо.
3

Вам необходимо создать Контроллер Представления Контейнера. Хотя iOS 5 явно поддерживает контроллеры контейнеров, вы можете создавать контроллеры контейнеров в предыдущих версиях. Все, что делает iOS 5, - это выполняет автоматическую пересылку событий поворота / появления (необязательно ... и лично я нахожу их раздражающими, отправляю события до того, как я буду готов) и даю вам несколько дополнительных методов для использования в вашей реализации. Реальная проблема при создании Контроллера Представления Контейнера заключается в отправке всех соответствующих событий на субконтроллеры и обеспечении того, чтобы вы управляли своими контроллерами способом, который согласуется с реализацией Apple. В противном случае вы получите странное поведение в своих субконтроллерах. Вы действительно должны убедиться, что полностью понимаете, как контроллеры представления работают полностью перед тем, как сделать это. Я рекомендую прочитать следующее:

Вот несколько ссылок на информацию:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html -Прокрутите вниз до: Реализация контроллера представления контейнера

Также здесь приведен жизненный цикл контроллера представления, который поможет вам определить, какие вызовы должны быть выполнены и в каком порядке:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html#//apple_ref/doc/uid/TP40007457-CH10-SW1

Я рекомендую прочитать полное руководство по программированию View Controller .... вы можете получить много информации оттуда:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457-CH1-SW1

0

Попробуй это

- (void)viewWillAppear: (BOOL)animated {
    [super viewWillAppear: animated];
    [self.messageViewController viewWillAppear];
}

- (void)viewDidAppear: (BOOL)animated {
    [super viewDidAppear: animated];
    [self.messageViewController viewDidAppear];
}

Похожие вопросы