iOS 右导航按钮不显示在 UINavigationBar

Posted

技术标签:

【中文标题】iOS 右导航按钮不显示在 UINavigationBar【英文标题】:iOS Right navigation button does not display in UINavigationBar 【发布时间】:2012-10-31 19:12:39 【问题描述】:

我有以下视图控制器层次结构:

视图控制器 VC1 选项卡栏控制器 TBC1 - 在情节提要中配置为指向表视图控制器 TVC1 和地图视图控制器 MVC1 表格视图控制器 TVC1 表格视图控制器 TVC2

在 VC1 中,我这样做:

[self.navigationController pushViewController:TBC1 animated:YES];

这正确地调出了标签栏控制器,并以 TVC1 为焦点。

TVC1 在其导航栏中显示后退按钮(通过 VC1 代码以编程方式创建),这将使我进入 VC1,这是预期的。

但是,从 TVC1 开始,我需要再导航一次到 TVC2。我正在尝试为此向 TVC1 导航栏添加右键,但它没有显示出来。

这是我在TVC1中使用的代码(rightButton是TVC1的UIButton类型属性):

   self.rightButton = [[UIBarButtonItem alloc]
                            initWithBarButtonSystemItem: UIBarButtonSystemItemAdd
                            target: self
                            action: @selector(MySelector:)];
   self.rightButton.style = UIBarButtonItemStyleBordered;
   self.rightButton.title = @"";
   self.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects:   self.rightButton, nil];

(指定空白标题和样式只是为了确保是否是导致此问题的问题,我实际上并不需要这些值)

MySelector 在 TVC1.h 中声明为:

- (void) MySelector:(id)sender;

而且它也得到了正确的实施。

但TVC1导航栏不显示上面的rightButton。

我错过了什么? 我怀疑它带有 VC1 和 TVC1 之间的 TBC1(标签栏),并且它以某种方式重置了导航属性。

但后来我争辩说我在 TVC1 上看到了导航栏,以及一个通向 VC1 的左按钮。 我检查了在 TBC1 中,self.navigationItem.rightBarButtonItems 里面有 1 个对象,这绝对是我要添加的 rightButton。

我哪里错了?

注意:以上适用于所有 ios 5.0、5.1 和 6.0 模拟器。

【问题讨论】:

你在TVC1的viewDidLoad中设置了rightBarButtonItems吗?顺便说一句:你为​​什么不直接self.navigationItem.rightBarButtonItem = self.rightButton; 【参考方案1】:

在我看来,您在故事板中的 TVC1 和 TVC2 之间缺少 UINavigationController。如果您使用的是故事板,那么您可以在导航控制器本身上创建导航项添加按钮类型,并对 TVC2 进行 PUSH segue。如果有意义,请参阅this 图表。如果这不能解决您的问题,请上传示例代码,我会看看。

[编辑]

我通过在情节提要中创建您的视图控制器结构重现了您的问题。

如果您注意到这里 TVC1 没有 UINavigationController 但它是从 VC1 继承的。解决您的问题的方法是将其添加到 self.parentViewController 而不是将 rightButton 添加到 self.parentViewController ,您将在 TVC1 中看到 rightButton。但请注意,它也会出现在 MVC1 中,因为它属于 TBC1 的父级。如果您不希望它出现在 MVC1 的 viewWillAppear 中,您可以隐藏右栏按钮。以下是代码。

self.rightButton = [[UIBarButtonItem alloc]
                    initWithBarButtonSystemItem: UIBarButtonSystemItemAdd
                    target: self
                    action: @selector(MySelector:)];
self.rightButton.style = UIBarButtonItemStyleBordered;
self.parentViewController.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects: self.rightButton,nil];

如果您想在 TVC1 的导航控制器中添加右键,则需要将 TVC1 嵌入 UINavigationController。为此,请在情节提要 -> 编辑器 -> 嵌入 -> 导航控制器中选择 TVC1 屏幕。当您这样做时,您的代码也将起作用并显示右键,但由于您的故事板结构,您将在其中有两个导航控制器(见下图)。您将需要将 Parent 的导航控制器隐藏到 TVC1 的视图中并加载并左键弹出到 Parentview 控制器。你在 MVC1 中做同样的事情。

希望这会有所帮助!快乐编码:)

【讨论】:

为什么每对视图控制器之间都必须有导航控制器?我不明白这一点。我在 TVC1 中有导航栏,该栏中也有左栏按钮。我唯一没有得到的是右栏按钮。我在故事板的开头有导航控制器,其他所有屏幕似乎都正常工作,左右按钮同时正确显示。 查看我编辑的答案。如果您的 VC 想要拥有自己的导航控制器,那么您确实需要将它们嵌入到 uinavigationcontroller 中!您使用后退按钮看到的是父导航控制器,您已将视图控制器推到该控制器上,该控制器可能有也可能没有导航控制器。我想你会明白我编辑的答案的意思。如果您仍有问题,请告诉我。 工作就像一个魅力。标记为正确和赞成。我尝试了 parentViewController 解决方案,因为我讨厌仅仅为了 TVC1 而在我的故事板中添加一个 NVC。我不明白为什么它适用于我有两个按钮的 VC1 - 我唯一的 NVC 用于 VC(VC1 的父级),所以即使 VC1 也不拥有 NVC!另外,如果他们希望 Navigation 控制器像一个堆栈,他们为什么要提出这个要求?毕竟一推,TVC1也有导航栏,从他们的整体设计来看。您是否知道任何可以解释这一点的文档? 很高兴它有帮助。您错过了将 TBC 推送到 VC1 的导航控制器而 VC1 没有导航控制器的事实!这样做,尝试将 Paren't UINavigation Controller 分配给 TVC1 中的 UINavigationController 变量并使用它,因为它属于 TVC1。请仔细阅读developer.apple.com/library/ios/#documentation/uikit/reference/… 每一行非常重要。我有时讨厌导航控制器的东西,所以我总是更喜欢实现自己的自定义导航方法。【参考方案2】:

最近在 Swift 中遇到了同样的问题,发现将子视图嵌入到 navigationController 仍然是能够访问 rightBarButtonItems 的正确方法。

【讨论】:

以上是关于iOS 右导航按钮不显示在 UINavigationBar的主要内容,如果未能解决你的问题,请参考以下文章

隐藏/显示导航栏中两个右栏按钮之一

无法在故事板iOS8的导航栏中添加右栏按钮

iOS - 只显示后退按钮而不显示导航栏的正确方法是啥?

ios,导航栏与其内容视图重叠

Bootstrap 4导航栏右对齐在移动设备上不折叠的按钮

将(右)按钮添加到 Sencha 导航视图