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

Posted

技术标签:

【中文标题】仅将子视图添加到当前视图的 UINavigationBar【英文标题】:Add subview to current view's UINavigationBar only 【发布时间】:2015-02-16 20:58:58 【问题描述】:

我想要做的是向我的 UINavigationController 的UINavigationBar 添加一个自定义视图,但仅适用于当前可见的视图控制器。

因此,我构建了要添加到容器视图中的视图的子视图,并将此视图通过以下方式获取到导航栏的引用:

let navBar = navigationController?.navigationBar as UINavigationBar!

结果如下:

但是,当我在 UINavigationController 堆栈中推送另一个视图控制器时,此子视图也会保留在推送的视图控制器的 UINavigationBar 中:

仅在我当前视图的 UINavigationBar 中添加此子视图的最佳方法是什么,并且它也不会保留在连续的视图控制器上?

【问题讨论】:

我认为最好的方法是将状态栏中的内容保存在viewWillAppear 中,然后在viewWillDisappear 中恢复它们。抱歉,我不确定这两种方法在swift中的对应物。但想法是一样的。 使用 UINavigationControllerDelegate 方法 willShowViewController didShowViewController 添加和删除视图,它会简化你的事情很多。 【参考方案1】:

发生这种情况有几个原因:

    UINavigationBar 添加子视图并非完全不受支持,但可能会导致奇怪的行为。

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

如果您想正确执行此操作,这里有两种可能的解决方案:

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

    使用UINavigationItemtitleView属性来分配这个视图,例如:

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

    这样搜索视图对于该视图控制器来说是唯一的。

【讨论】:

标题视图的边界是什么?它可以促进像这样扩展几乎全宽度的视图吗?这听起来对我来说是最好的选择。 @Thanos 它应该允许您将其扩展为全宽(前提是没有左右项目)。当我完成此操作之前,我能够毫无问题地将titleView 的框架设置为完整的导航栏。 第二个选项如何使用自动布局?

以上是关于仅将子视图添加到当前视图的 UINavigationBar的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 将子视图添加到子视图控制器视图

将子视图添加到视图控制器

将子视图添加到 UICollectionViewCell 子类?

将子视图添加到屏幕问题

从另一个方法将子视图添加到子视图

iOS:将子视图添加到倒数第二个位置