【问题标题】:Add common views once in navigation controller在导航控制器中添加一次公共视图
【发布时间】: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,“同样的事情”是为了与 newalloc init 相关 - 我可以看到混乱。我已经改变了我的方法,通过情节提要使BaseViewController 实例化 - 不幸的是,它没有帮助。我已经设法查明了这个问题 - childVieControllerContainer 是一个 IBOutlet,在我的静态方法中它是 nil(这在使用 new 时很明显,但我认为使用 instantiateViewController... 会设置它们正确。

标签: ios objective-c swift uinavigationcontroller childviewcontroller


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多