iPhone如何将一个视图控制器的视图添加到另一个视图控制器的视图中?

3

我很久以前就想知道如何将一个由视图控制器管理的视图添加到另一个视图控制器的视图中,但我不确定该如何正确实现。

这样做是行不通的,因为视图没有加载完成。

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

我如何将一个从nib创建的UIView添加到另一个视图控制器的视图中? 我如何强制加载这样的视图以便在添加它之前进行操作?


你是从哪个方法调用的?viewDidLoad 还是 init?如果你从 init 调用,self.view 尚未创建。 - Kekoa
3个回答

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 我建议阅读整个视图控制器编程指南...您可以从中获得很多信息:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457-CH1-SW1

2
一般情况下不要这样做,因为这会破坏关于UIViewControllers如何使用的一些假设,并且很可能在未来会给你带来问题。你不能指望子视图的控制器接收到所有你期望的UIViewController生命周期方法调用。
有效的解决方案是使用iOS 5容器视图控制器方法将子视图的控制器作为子视图控制器添加,或者如果需要封装该行为,则使用非UIViewController控制器类负责管理该子视图。

我很好奇,你能告诉我这违反了哪些假设吗? - Kekoa
@Kekoa 当然,我在这里尝试涵盖了这个问题;http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers。这篇文章早于iOS 5的子视图控制器支持,因此没有讨论它作为替代方案,但除非您使用这些方法,否则我所讨论的所有内容仍然适用。 - Jonah

0

试试这个

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接