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

Add subview to current view's UINavigationBar only

我想做的是将自定义视图添加到我的 UINavigationController 的 UINavigationBar,但仅限于当前可见的视图控制器。

所以我构建了我想在容器视图中添加的视图的子视图,并通过获取引用将此视图添加到导航栏:

let navBar = navigationController?.navigationBar as UINavigationBar!

结果如下所示:

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

仅在我当前视图的 UINavigationBar 中添加此子视图并且不让它也持续存在于连续的视图控制器中的最佳方法是什么?

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

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

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

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

  1. 当您的理想视图控制器可见时,使用 viewWillAppearviewWillDisappear 到 add/show 和 remove/hide 您的子视图。

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

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

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