在导航控制器中添加一次公共视图

Add common views once in navigation controller

我想要实现的是在界面生成器中设计 UI 的 "shared" 部分,并使用子视图控制器向用户显示内容。这听起来像是在尝试重新发明 UINavigationController,但事实并非如此。事实上,整个事情都嵌入在一个里面。

看起来像这样:

现在,我要做的是更改此 BaseViewController 的子视图控制器并在导航栏中指出此更改,以便保留其所有功能。

我试过添加这样的方法:

+ (UIViewController *)baseViewControllerWithChild:(UIViewController *)child {
    BaseViewController *base = [BaseViewController new];
    [base addChildViewController:child];
    child.view.frame = base.childViewControllerContainer.frame;
    [base.view addSubview:child.view];
    [child didMoveToParentViewController:base];

    return base;
}

然后像这样使用它:

- (void)didTouch:(UIButton *)sender { 
    [self.parentViewController.navigationController pushViewController:[BaseViewController baseViewControllerWithChild:[DummyViewController new]] animated:YES];   
}

(注意:DummyViewController 正是 - 一个虚拟的 vc,仅用于测试,它只在 viewDidLoad 中设置了背景颜色)

此方法是第一个子视图控制器中按钮的处理程序。到目前为止,一切都很好。不幸的是,结果并不如预期——推送的视图控制器是黑色的。一开始我以为这是因为 BaseViewController 是在 storyboard 中设计的,最初设置为导航控制器的 rootViewController。将它移动到 xib 文件并从代码设置对我来说不太管用,因为你不能在 xib.

中添加 Container View

总而言之,我希望有一个由 BaseViewController class 管理的基础设计,内容将作为其 childViewController 添加。推送一个新的视图控制器将是对这些 childViewController 的操作的结果,并且应该相应地更新导航堆栈。

此外,整个事情需要与 iOS 7.

一起工作

非常感谢任何关于如何尝试实现这一目标的帮助!

问题是由 base.childViewControllerContainer 引起的 nil - 这是由于 view 属性 的视图控制器被延迟加载的事实引起的。在访问 base.childViewControllerContainer 之前添加 [base view] 解决了这个问题,但我不确定这是否是唯一的、最好的方法。