0

标题很清楚地说明了这个问题。但这里有一些上下文可能会使事情更清楚:

我正在开发一个电子邮件客户端应用程序,该应用程序将 UINavigationController 作为根 VC 附加到主窗口(您可以在 UI 工作原理下查看 UI层次结构):

    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];

我想在邮件视图上实现滑动视图控制器效果。

问题是滑动视图控制器效果是作为自定义容器视图控制器实现的。假设您通过启动包含视图控制器(我们称之为它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,它也可以是这个所谓的子视图ECSlidingViewController吗?b/c 我希望它包含在由导航控制器作为父/控制的导航控制器中,并且我希望它上下滑动......这意味着它必须也是ECSlidingViewController.

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

4

1 回答 1

1

简短的回答

不..一个视图控制器不能包含多个父控制器..这在 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 .. 并且在任何时候都可以将自定义容器作为另一个控制器的子级包含在内,反之亦然.. 最好在这里总结这一点:

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 成为我的自定义包含控制器的子级..因为我在孩子和父母之间以及兄弟姐妹之间可以灵活地交流..我只能让 UINavigation 上下滑动选择 Mailview 时。

于 2013-01-10T07:47:56.340 回答