如何根据 UINavigationController 中显示的 UIViewController 更改 UINavigationBar

Posted

技术标签:

【中文标题】如何根据 UINavigationController 中显示的 UIViewController 更改 UINavigationBar【英文标题】:How to change UINavigationBar depending on the UIViewController shown in UINavigationController 【发布时间】:2016-04-03 17:32:59 【问题描述】:

正如问题所说,当 UINavigationController 显示不同的 UIViewController 时,我需要能够更改 UINavigationBar 的内容。这对于标题来说很容易实现,因为导航控制器只使用视图控制器的标题属性。我正在努力的是根据视图控制器更改左右栏按钮项。

我用来更改它们的代码已经在多个其他问题中得到解决,并不是真正的问题,尽管我将使用以下代码作为参考:

UIBarButtonItem *newItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:
    UIBarButtonSystemItemAdd target:self action:nil];
newItem.tintColor = [UIColor whiteColor];
self.navigationItem.rightBarButtonItem = newItem;

我认为我正在寻找的是一种方法,每次导航控制器显示新的 UIViewController 时都会调用该方法,以设置导航控制器布局。在 UINavigationController 的文档中有如下方法:

// Called when the navigation controller shows a new top view controller via a push, pop or setting of the view controller stack.
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

但是,当我运行应用程序时,似乎在任何时候都不会调用此方法。那么,当导航控制器显示新的视图控制器时,是否有一个方法被调用?还是我在这里完全错了,并且已经有一种可以接受的方式来改变导航栏并在其下方显示视图,而我到目前为止错过了?

【问题讨论】:

该方法是UINavigationControllerDelegate 协议的一部分,而不是UINavigationController 本身。您是否采用了协议并设置了delegate 你想通过什么方式改变不自动发生的导航栏? 通常您在每个视图控制器中单独分配 barButton 项(自动添加后退按钮)。您是否有理由要在导航控制器中执行此操作? @pbasdf,我的印象是委托被自动设置为控制 uinavigationcontroller 的类,这很可能是我出错的地方。 Wain,我不希望上一个uiviewcontroller 的标题在左上角的空间中,我想根据视图控制器将UIBarButtonSystemItemAdd 等各种图像添加到右上角的空间中。乔本顿,这也可能是我出错的地方!将我引用的代码放在每个控制器的 ViewDidLoad 方法中会更好吗? 【参考方案1】:

典型的解决方案是将代码放入每个视图控制器的 viewDidLoad 方法中,该方法设置所需的按钮。

您问题中的第一段代码将是视图控制器设置所需按钮的完美示例,该按钮在显示(视图控制器)时显示在导航栏的右侧。

您无需与导航控制器委托或导航控制器本身做任何事情。

【讨论】:

以上是关于如何根据 UINavigationController 中显示的 UIViewController 更改 UINavigationBar的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController

UINavigationController 风格

全屏显示 ViewController

多控制器

UINavigationControllerDelegate 不起作用

viewController 出现时出现黑色