【发布时间】:2015-12-24 13:00:04
【问题描述】:
我想要实现的是在界面构建器中设计我的 UI 的“共享”部分,并使用子视图控制器向用户显示内容。这听起来像是试图重塑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 类管理的基本设计,并且内容将作为childViewController 添加。推送新的视图控制器将是对这些 childViewController 的操作的结果,并且应该相应地更新导航堆栈。
此外,整个事情都需要在 iOS 7 上运行。
非常感谢任何有关如何尝试实现此目标的帮助!
【问题讨论】:
-
您说,“BaseViewController 是在情节提要中设计的”。您是否应该使用故事板来实例化它而不是仅仅创建一个独立的对象?
-
我也尝试过将它设计在
xib中,正如解释的那样,但它并没有帮助我。此外,它不是通过[UIStoryboard instatiateViewController...]实例化的,而是通过查看new(或alloc init),因为它是同一件事。如果需要,我可以在代码中设计视图,但我想尽可能多地使用界面生成器。 -
尝试使用
instantiateViewControllerWithIdentifier:。这真的不是“同一件事”。 -
Yukes,“同样的事情”是为了与
new和alloc init相关 - 我可以看到混乱。我已经改变了我的方法,通过情节提要使BaseViewController实例化 - 不幸的是,它没有帮助。我已经设法查明了这个问题 -childVieControllerContainer是一个IBOutlet,在我的静态方法中它是nil(这在使用new时很明显,但我认为使用instantiateViewController...会设置它们正确。
标签: ios objective-c swift uinavigationcontroller childviewcontroller