UIViewController在UIView中的应用

10

我能够在另一个UIViewController的UIView中加载一个UiViewController吗?

假设UIViewControllerA有一个名为subuiview的UIView。我能否将UIViewControllerB加载到subuiview中?

谢谢!

4个回答

24

iOS 5开始

在iOS 5中添加了"容器视图控制器"。您可以使用addChildViewController:将一个视图控制器作为另一个视图控制器的子级添加。
您还需要负责将其视图添加到其父视图中。

iOS SDK文档中有详细的说明: 实现自定义容器视图控制器

要添加子视图控制器:

childViewController.frame = ...
[self.view addSubview:childViewController.view];
[self addChildViewController:childViewController];
[childViewController didMoveToParentViewController:self];

并将其移除:

[self willMoveToParentViewController:nil];
[self.view removeFromSuperview];
[self removeFromParentViewController];

iOS 5之前

可以加载另一个视图控制器,将其视图作为另一个控制器视图的子视图添加。

UIViewController *subController = ...
[self.view addSubview:subController.view];

尽管不被苹果的指南推荐: 每个自定义视图控制器对象都负责管理单个视图层次结构中的所有视图。... 视图控制器与其视图层次结构之间的一对一对应是关键的设计考虑因素。您不应使用多个自定义视图控制器来管理同一视图层次结构的不同部分。 (来自View Controller编程指南
您的子控制器将不会接收旋转事件,也不会接收viewWillAppear、viewWillDisappear等事件(除了viewDidLoad)。
因此,苹果建议我们使用单个视图控制器来管理整个视图层次结构(但并不禁止使用多个视图控制器)。
每个视图仍可以是UIView的自定义子类。也许您不需要另一个视图控制器,而是需要一个自定义视图。

只使用一个视图,怎样才能实现这个功能? - nishantcm
一个视图控制器可以有两个xib文件吗? - nishantcm
@nishantcm 是的,它可以有两个xib。例如使用initWithNibName:@"Xib1" bundle:nilinitWithNibName:@"Xib2" bundle:nil - Jilouc
我可以为UIView(而不是UIViewController)获取一个xib吗? - nishantcm
1
@Rob,你说得完全正确。我已经更新了答案以反映这一点。 - Jilouc
显示剩余3条评论

2
使用addSubview将一个视图控制器的视图作为另一个视图的子视图一直是有问题的。特别是当人们使用它来在视图之间进行转换时,而不是依靠其他更强大的解决方案,如presentViewControllerpushViewController
如果您真的想将一个视图控制器的视图作为另一个视图控制器的子视图添加,iOS 5引入了“视图控制器容器”。 容器在View Controller Programming GuideWWDC 2011 session 102中有讨论。总之,您需要通过调用addChildViewControllerdidMoveToParentViewController等方法确保您的视图控制器层次结构与视图层次结构同步。有关详细信息,请参阅文档和视频。

如果你想在另一个 viewController 中展示一个 viewController,该怎么办? - Daniel
1
@simpleBob 如果你想在一个视图控制器的视图中展示另一个视图控制器的视图,那么你需要使用“视图控制器容器”(参见我上面回答中的链接)。所以,当然,你可以使用addSubview,但非常重要的是,你还需要做很多其他工作,以保持视图控制器层次结构与视图层次结构同步(例如addChildViewController等)。如果你想了解有关此主题以及为什么正确执行它很重要的良好介绍,请查看那个WWDC视频。 - Rob
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Daniel

2
[self addSubview:viewControllerB.view];

在子视图中尝试这个


0

实际上你不能直接加载一个视图控制器,但是你可以将一个视图控制器的视图作为任何视图的子视图来加载。

你还需要保留视图控制器,以防它绑定了任何操作。否则可能会导致崩溃。

addsubview:controller.view 是你需要关注的方法。


UIViewController *myViewControler = [[UIViewController alloc] init]; [someAnotherView addSubview:myViewController.view]; 视图控制器 *myViewControler = [[UIViewController alloc] init]; [someAnotherView addSubview:myViewController.view]; - nishantcm
我正在使用上述代码。如果我在someAnotherView中加载另一个视图控制器,第一个视图会被释放吗? - nishantcm

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