将子视图添加到当前视图的UINavigationBar中

10
我想做的是在当前可见的视图控制器中,向我的 UINavigationController 的 UINavigationBar 添加一个自定义视图。 因此,我将要添加的子视图构建在一个容器视图中,并通过获取引用将该视图添加到导航栏中:
let navBar = navigationController?.navigationBar as UINavigationBar!

结果看起来像这样:

在此输入图片描述

然而,当我在UINavigationController堆栈中推送另一个视图控制器时,这个子视图也会存在于推出的视图控制器的UINavigationBar中:

在此输入图片描述

有什么最好的方法只将这个子视图添加到当前视图的UINavigationBar中,并且不要让它在连续的视图控制器中持久存在?


我认为最好的方法是在 viewWillAppear 中保存状态栏中的内容,并在 viewWillDisappear 中恢复它们。很抱歉,我不确定这两种方法在 Swift 中的对应方法。但是思路是相同的。 - Ra1nWarden
使用UINavigationControllerDelegate的方法willShowViewController和didShowViewController来添加和删除视图,这将大大简化您的工作。 - Sandeep
1个回答

13

这是由于以下几个原因:

  1. 将一个子视图添加到UINavigationBar并不完全不被支持,但可能导致奇怪的行为。

  2. UINavigationController中的所有视图控制器共享同一个UINavigationBar(这就是为什么新推的视图控制器对你的子视图没有任何影响)。

如果您想要正确地实现,以下是两种可能的解决方案:

  1. 使用viewWillAppearviewWillDisappear在您理想的视图控制器可见时添加/显示和删除/隐藏您的子视图。

  2. 使用UINavigationItemtitleView属性来分配此视图,例如:

    // Example code in Obj-C, sorry!
    myViewController.navigationItem.titleView = [[MySearchView alloc] init];
    

    这样搜索视图将与该视图控制器唯一对应。


标题视图的边界是什么?它能否支持像这样几乎完全展开的视图?对我来说,这似乎是最好的选择。 - Thanos
@Thanos,它应该允许您将其展开到全宽(前提是没有左右项目)。当我之前做过一次时,我能够将“titleView”的框架设置为完整的导航栏,没有任何问题。 - mattsven
如何使用自动布局的第二个选项? - Bigair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接