ViewController可以包含多个Parent(即包含)控制器吗?

时间:2013-01-09 12:21:27

标签: ios objective-c ios5 uiviewcontroller uinavigationcontroller

标题设定的问题非常清楚......但这里有一些背景可能会让事情变得更清楚:

我正在开发一个电子邮件客户端app,它将UINavigationController作为根VC附加到主窗口(您可以在下看到UI如何运行UI hirarchy here ):

    HomeViewController *homeController = [[HomeViewController alloc] initWithNibName:@"HomeView" bundle:nil];
    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:homeController];
    [self.window addSubview:navController.view];

稍后它将视图控制器推送到导航控制器,即文件夹视图 - >邮箱视图 - >邮件视图等:

[self.navigationController pushViewController:someController animated:YES];

我想在邮件视图上实现sliding view controller effect

问题是滑动视图控制器效果是以Custom Container View Controller实现的。假设你通过启动包含视图控制器(让它调用它ECSlidingViewController)来启动应用程序,这是一个窗口根视图控制器..然后你添加顶视图控制器(即第一个)查看显示的控制器):

ECSlidingViewController *slidingViewController = (ECSlidingViewController *)self.window.rootViewController;

slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstTop"];

然后你附加应该出现在顶视图控制器下的视图控制器(slidingViewController是,并且在这个例子中始终是唯一包含控制器):

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];

  if (![self.slidingViewController.underLeftViewController isKindOfClass:[MenuViewController class]]) {
    self.slidingViewController.underLeftViewController  = [self.storyboard instantiateViewControllerWithIdentifier:@"Menu"];
  }

  [self.view addGestureRecognizer:self.slidingViewController.panGesture];
  [self.slidingViewController setAnchorRightRevealAmount:280.0f];
}

我想弄清楚的是......鉴于我的邮件视图在技术上是UINavigationController的子视图控制器,它也可以是这个所谓的{{1}的孩子}? b / c我希望它被包含在由导航控制器设置/控制的导航控制器中,我希望它能够上下滑动......这就要求它必须也是的孩子ECSlidingViewController

此外,假设一个VC可以有多个父...在上面的例子的上下文中..我应该在视图层次结构中添加该父项?我应该将它添加为UINavigationController的子代吗?这是否与最佳实践一致(假设有一些)?

1 个答案:

答案 0 :(得分:1)

简短回答

no ..一个viewcontroller不能包含多个父控制器..这在UIView类引用insertSubview:aboveSubview的描述中几乎是明确提到的: Views can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview. 由于每个视图控制器都直接与一个视图关联,因此从上面可以看出视图控制器不能有多个父控制器。

长答案

经过大量研究和使用代码..事实证明,我正在查看错误的问题...长话短说..自定义容器视图控制器遵循适用于预构建容器的相同规则控制器如UINavigation和UITab ..并且在任何时候都可以将自定义容器作为另一个控制器的子容器包含在内,反之亦然。这一点最好总结为here

A container controller can be both a parent to other controllers and a child of another container. Ultimately, this combination of controllers establishes a view controller hierarchy.

因此,如果您想知道是否应该将两个父级连接到同一个视图控制器..那么您应该重新考虑您的视图层次结构..b / c这种情况不应该发生。在上面的问题的上下文中..我应该让UINavigationController成为我的自定义包含控制器的子项..因为我在孩子和父母之间以及兄弟姐妹之间有flexibility of communication ..我可以让UINavigation向上滑动仅在选择Mailview时关闭。