仅将子视图添加到当前视图的 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
(这就是为什么新推送的视图控制器对您的子视图没有任何影响)。
如果您想正确执行此操作,这里有两种可能的解决方案:
当您的理想视图控制器可见时,使用viewWillAppear
和viewWillDisappear
添加/显示和删除/隐藏您的子视图。
使用UINavigationItem
的titleView
属性来分配这个视图,例如:
// Example code in Obj-C, sorry!
myViewController.navigationItem.titleView = [[MySearchView alloc] init];
这样搜索视图对于该视图控制器来说是唯一的。
【讨论】:
标题视图的边界是什么?它可以促进像这样扩展几乎全宽度的视图吗?这听起来对我来说是最好的选择。 @Thanos 它应该允许您将其扩展为全宽(前提是没有左右项目)。当我完成此操作之前,我能够毫无问题地将titleView
的框架设置为完整的导航栏。
第二个选项如何使用自动布局?以上是关于仅将子视图添加到当前视图的 UINavigationBar的主要内容,如果未能解决你的问题,请参考以下文章