iOS右侧导航按钮在UINavigationBar中未显示

4

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

  • 视图控制器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。

我错过了什么吗? 我怀疑是TBC1(选项卡栏)的问题,它位于VC1和TVC1之间,并且以某种方式重置了导航属性。

但是,我认为我在TVC1上看到了导航栏,并且有一个向左的按钮可以返回VC1。 我检查了一下,在TBC1中,self.navigationItem.rightBarButtonItems里面有1个对象,其中绝对是我添加的rightButton。

我错在哪里了?

注意:以上内容在所有iOS 5.0、5.1和6.0模拟器中都可以找到。


你在 TVC1 的 viewDidLoad 中设置了 rightBarButtonItems 吗?顺便问一下,为什么不直接使用 self.navigationItem.rightBarButtonItem = self.rightButton; 呢? - Eddie G.
2个回答

6
在你的故事板中,TVC1和TVC2之间似乎缺少UINavigationController。如果你在使用storyboards,那么你可以在导航控制器本身上创建导航项添加按钮类型,并将其推到TVC2。如果有必要,可以查看图表以了解更多信息。如果这不能解决你的问题,请上传示例代码,我会帮你查看。
[编辑]
我已经在storyboard中创建了你的视图控制器结构,重现了你的问题。 storyboard 如果你注意到这里,TVC1没有它自己的UINavigationController,但它是从VC1继承的。解决你的问题的方法是,不要将rightButton添加到self上,而是将其添加到self.parentViewController上,这样你就可以在TVC1中看到rightButton。但请注意,它也会出现在MVC1中,因为它属于TBC1的父级。如果你不想在MVC1中显示它,可以在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屏幕->编辑器->嵌入->导航控制器。这样做后,您的代码也将起作用,并会显示正确的按钮,但由于您的故事板结构,其中会有两个导航控制器(如下图所示)。您需要在TVC1的viewDidLoad中隐藏父级导航控制器并设置左侧按钮以返回到父视图控制器。您可以在MVC1中执行相同的操作。
希望这能有所帮助!祝编码愉快 :)

为什么每对视图控制器之间都必须有导航控制器?我不理解这一点。我在TVC1中获得了导航栏,并在该栏中设置了左侧按钮。唯一的问题是右侧按钮。我在故事板的开头放置了导航控制器,每个其他屏幕似乎都能正常工作,左右按钮同时正确显示。 - Nirav Bhatt
请查看我的编辑后的答案。如果您的VC想要拥有自己的导航控制器,那么您确实需要将它们嵌入到uinavigationcontroller中!您在返回按钮中看到的是父级导航控制器,您已将其推送到其中的视图控制器,该视图控制器可能具有或不具有导航控制器。我认为您会明白我的编辑答案的意思。如果您仍有问题,请告诉我。 - Paresh Masani
运行得像魔法一样。标记为正确并点赞。我尝试了parentViewController的解决方案,因为我不想只为了TVC1而在我的storyboard中再添加一个NVC。我不明白为什么它适用于同时具有两个按钮的VC1,而我的唯一NVC是VC(VC1的父级),因此即使VC1没有拥有NVC!另外,如果他们希望导航控制器像堆栈一样,为什么会有这个要求?毕竟,一旦推动,TVC1也拥有导航栏,在他们设计的整体视图中。您是否知道任何可以解释这一点的文档? - Nirav Bhatt
很高兴它有所帮助。你忽略了一个事实,即你正在将TBC推到VC1的导航控制器上,而VC1没有导航控制器!请尝试将父级UINavigationController分配给TVC1中的UINavigationController变量,并像属于TVC1一样使用它。请仔细阅读http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html,每一行都非常重要。我有时讨厌导航控制器的东西,所以我总是更喜欢实现自己的自定义导航方法。 - Paresh Masani

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接