在Xcode中将一个视图控制器加载到另一个视图中

7
我正在开发一个iPad应用程序。这个应用程序只包含两个视图,但是每个视图都包含很多按钮和标签。目前,这两个视图的布局已经设置好了。每个视图都在一个视图控制器中设置。我还有另一个视图控制器,其中包含顶部的主菜单和一个大容器(UIView),我希望它能够容纳我提到的两个视图。
我的问题是,是否有一种方法可以在一个视图中显示一个视图控制器?当我点击主菜单中的一个按钮时,我想在那个容器(UIView)中显示一个视图控制器,并在点击另一个按钮时显示另一个视图控制器。如果我的计划不可行,请提出一些建议以使相同的事情起作用。
非常感谢!
2个回答

12

你可以通过像下面这样添加UIViewController视图来轻松完成它。

_viewController=[self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[self.view addSubview:viewController.view];

一旦您在 ViewController 中添加了 viewController.view,您的 viewDidLoad 方法就会被调用。

更新:根据 UIViewController 类参考 ,在将一个 UIViewController 作为子视图添加到另一个 ViewController 中时,您需要再添加两个步骤。

[self addChildViewController:viewcontroller];
[self.view addSubview:viewController.view];
[viewcontroller didMoveToParentViewController:self];
以上完成了答案。
希望这有所帮助。 祝好。

好的,一个后续问题。如果我想在子视图中更改视图控制器,我需要删除先前的视图控制器并添加另一个新的吗? - JLT
@EpicNinja,我没有理解你的问题,你是在问如果你想对已添加的视图控制器进行任何更改吗?如果是这样,你不需要再次添加它,你可以为特定任务创建函数,并使用你肯定拥有的视图控制器对象调用它。 - iphonic
我是说,每次我想在容器下切换到不同的视图时,我只需将其作为子视图添加即可?不需要删除我添加的先前视图吗? - JLT
是的,不需要删除,但可以隐藏。 - iphonic
是的,别忘了在将视图控制器添加为子视图之前和之后添加 [self addChildViewController:viewcontroller];[viewcontroller didMoveToParentViewController:self];,我错过了这一点。 - iphonic
显示剩余10条评论

8

自定义容器视图控制器正是您所需要的。如果您使用Interface Builder和storyboards,请找到一个容器视图,将其拖到您的视图中,并将包含的类设置为您的视图控制器。
对象库中的容器视图

如果您不使用storyboards或IB(我鼓励您这样做),请按照上面的链接实现向您的视图控制器添加子视图控制器。千万不要在没有先调用addChildViewController:的情况下添加子视图,否则可能会导致意外结果。通常,添加子视图控制器应按以下顺序进行:

  1. 调用[self addChildViewController:childvc]
  2. 将子VC的视图作为子视图添加[self.view addSubview:childvc.view]
  3. 调用[childvc didMoveToParentViewController:self]

在这种情况下,一切都将正常工作。


谢谢@Sega-Zero。我会尝试的。 :) - JLT
有没有办法可以防止每次加载视图?我在容器视图中有4个控制器作为子视图控制器,但每次更改选项卡时它都从头开始加载控制器。最初,我只想加载我的视图一次。 - Mitesh Dobareeya
在这种情况下,也许使用隐藏的选项卡栏的UITabBarController会更好? - Sega-Zero

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