【问题标题】:How can a view controller "embed" itself in a UINavigationController - espessially when contained in a container view controller视图控制器如何将自身“嵌入”到 UINavigationController 中 - 尤其是包含在容器视图控制器中时
【发布时间】:2014-05-06 04:02:02
【问题描述】:

对不起,说来话长 -

我有一些关于正确使用导航控制器层次结构的问题。

每个UIViewController 都有一个属性self.navigationController

但并非每个视图控制器都从导航控制器呈现 - 因此该属性可能为 nil。

更是如此 -

一些视图控制器期望能够做到:

[self.navigationController presentViewController:nextViewController];

但如果它本身不包含在导航控制器层次结构中,则该表达式不会做任何事情。

所以视图控制器实习生可以测试它是否嵌入到导航控制器中:

if (self.navigationController == nil)
{
  // create a UINavigationController with a root view controller - the next view controller
  UINavigationController *nav = [UINavigationController alloc] initWithRootViewController:nextViewController];
  [self presentViewController:nav];
}

但这可能会破坏目的 - 因为如果呈现视图控制器不在导航控制器中 - 为什么下一个视图控制器必然需要在导航控制器中。为什么当前视图控制器不这样做:

[self presentViewController:nextViewController];

并跳过导航控制器的创建?

在这些确切的线路上 - 我面临的另一个问题 -

一些视图控制器期望从UINavigationController 呈现 -

因为他们在提供的导航控制器栏中设置了导航项 - 工具栏项、标题等。

如果出于某种原因他们的self.navigationController == nil - 他们如何“将自己”“放入”导航控制器中以确保他们可以访问那些预期的元素???

关于导航控制器问题中的容器视图控制器:

如果您查看股票 iOS 音乐应用程序 - 您可以看到 UITabBarController 嵌入在 UIViewNavigationController 中 - 每个选项卡都是一个单独的视图控制器 - 而每个选项卡都可以“推送”和“弹出”视图控制器本身。

我需要实现类似的效果(但布局不同),所以我创建了一个容器视图控制器,里面有 UITabBar 视图。

然后我在该容器视图控制器中创建了一个演示文稿container 视图

这个容器是每个子视图控制器的视图呈现的地方。(那些是“父视图控制器”的“子视图控制器”) - 这有点绕口令,对此我深表歉意。

标签栏切换 - 父视图控制器交换该容器中的可见视图控制器。

现在每个视图控制器都非常通用 - 他们不知道自己的容器,但希望设置一个 UINavigationController 变量(非零)以设置标题 - 按钮 - 导航项等。

通用黑盒视图控制器如何在导航控制器中“呈现”自身(嵌入)-

容器视图控制器如何设置子视图控制器的navigationController 属性?

【问题讨论】:

    标签: ios iphone objective-c uiviewcontroller uinavigationcontroller


    【解决方案1】:

    我有一个应用程序,它有一个占位符 (self.mainView),用于根据选项卡选择放置 viewController。其中一些需要 NavigationController,而另一些则不需要。如果 self.navigationController == nil 并相应地工作,您始终可以进行测试。

    这是我用来在占位符中显示 viewController 的一些示例代码,可能会对您有所帮助。

    if (self.currentController) {
        [self.currentController willMoveToParentViewController:nil];
        [[self.currentController view] removeFromSuperview];
        [self.currentController removeFromParentViewController];
        self.currentController = nil;
    }
    
    
    switch (tag) {
        case 0:
            self.currentController = [self.storyboard instantiateViewControllerWithIdentifier:@"AboutViewController"];
            break;
    
        case 1: {
            UINavigationController *controller = [[UINavigationController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"EventsViewController"]];
            self.currentController = controller;
        }
            break;
    }
    
    
    if (self.currentController) {
        [self addChildViewController:self.currentController];
        [self.mainView addSubview:self.currentController.view];
        [self.currentController didMoveToParentViewController:self];
        [self adjustMainView];
        [self.view layoutIfNeeded];
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-10
      • 1970-01-01
      • 2014-06-13
      • 2017-12-13
      • 1970-01-01
      • 2016-08-22
      • 2015-04-16
      • 1970-01-01
      • 2012-04-29
      相关资源
      最近更新 更多