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;

它也得到了适当的实施。

但是上面的 rightButton 并没有显示在 TVC1 的导航栏中。

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

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

我哪里错了?

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

4

2 回答 2

6

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

[编辑]

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

故事板

如果您注意到这里 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 中做同样的事情。

希望这可以帮助!快乐编码:)

输出

于 2012-10-31T20:21:53.323 回答
0

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

于 2016-08-31T09:02:03.547 回答