在导航控制器

时间:2015-12-24 13:00:05

标签: ios objective-c swift uinavigationcontroller childviewcontroller

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

看起来像这样: example view

现在,我尝试做的是更改此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文件并通过代码设置并不适合我,因为您无法在Container View中添加xib

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

此外,整个事情需要与iOS 7一起使用。

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

1 个答案:

答案 0 :(得分:0)

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