【问题标题】:Navigation Bar not accessible from Tab Bar controller导航栏无法从标签栏控制器访问
【发布时间】:2015-02-16 08:34:15
【问题描述】:

下图中显示的是我正在尝试使用以下层次结构创建的设置:

  1. 嵌入到导航控制器中的根单一视图控制器(左起,屏幕截图中的第二个视图)(左起,屏幕截图中的第一个视图)。
  2. 标签栏控制器(从左到右,从根 vc 访问的屏幕截图中的第三个视图
  3. 2 个视图控制器(屏幕截图中最右边的 2 个视图)嵌入在标签栏控制器中,似乎也仍然在导航栏控制器中。

每个标签栏控制器都显示一个导航栏(如您在右侧的 2 个视图中所见)。起作用的逻辑是当我按下根上的按钮时,标签栏控制器打开。您可以通过标签栏在标签之间导航,然后按导航栏中的后退按钮返回到根目录。

我不明白如何访问每个最右侧视图的导航栏。如上所述,导航栏显示后退按钮,但我无法访问标题,或添加任何导航栏按钮。当我这样做时,什么都没有显示(后退按钮除外)。所以我想要的是能够在连接到标签栏控制器的每个视图控制器中设置导航栏的标题。如下图所示,显然有一个来自嵌入式根视图控制器的导航栏。

更多信息可能会让事情更清楚:

  • 我从标签栏控制器到标签栏管理的每个视图控制器都有关系。
  • 我尝试将最右侧的视图控制器嵌入到导航控制器中,但这仍然不起作用。
  • 我尝试手动将导航栏项添加到视图控制器,但也无法访问标题。

任何想法我做错了什么?谢谢!

【问题讨论】:

  • 你能补充一下,到目前为止你做了哪些尝试?喜欢在最右边的视图控制器中访问导航栏。 (任何代码?)
  • 还有另一种混合导航和标签栏控制器的设置。使您的初始控制器成为标签栏控制器(在开始时删除导航控制器)。然后为 tabbar 控制器 viewControllers 中的每个视图控制器添加一个导航控制器。
  • 谢谢@AmroShafie,我会试试看的。

标签: ios xcode uinavigationcontroller storyboard uitabbarcontroller


【解决方案1】:

我找到了一种方法:

在标签栏控制器管理的每个视图控制器中,我将这个添加到 viewWillAppear 方法中:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    PHOrderTabBarViewController *orderTabBarViewController = (PHOrderTabBarViewController *)self.tabBarController;
    orderTabBarViewController.title = @"Contacts";
    orderTabBarViewController.navigationItem.rightBarButtonItem = nil; // if no button is used
}

PHOrderTabBarViewController 是管理屏幕截图右侧视图控制器的 TabBarViewController。由于导航控制器嵌入在 TabBarViewController 中,因此我必须从那里设置标题和任何按钮。

注意!!:在标签之间导航时,需要在标签栏控制器管理的每个视图控制器中添加以上内容。否则,导航栏项目将转移到其他视图。 (例如,在我的代码中,导航标题设置为“联系人”,如果我按下另一个选项卡,它仍会显示“联系人”,除非我在该视图的 viewWillAppear 方法中重置标题/按钮。

有了这个结果,我不确定这是否是在这里使用的正确行为或模式。该应用程序现在按预期工作,但我不知道如果任何选项卡式栏控制器需要导航到更深层次的层次结构,我是否会遇到导航问题。另外,我还没有尝试过@AmroShafie 的建议,但如果我这样做了,我会回来记录结果。

【讨论】:

  • 您应该在viewDidLoad 中执行此操作。每次切换到该视图控制器时,您拥有它的方式都会运行该代码。
  • @LarryBorsato 不起作用,因为 viewDidLoad 方法在 tabBarController 设置中仅调用一次(编辑:每个 ViewController 一次),同时在选项卡之间切换,如果用户在两个选项卡上来回切换。
【解决方案2】:

在每个视图控制器的 viewDidLoad 方法中,您应该这样做(根据需要从 @"Contacts" 更改标题:

self.title = @"Contacts";
self.navigationItem.rightBarButtonItem = nil; // if no button is used

视图控制器负责自己的导航栏。在您的 AppDelegate 中,您可以像这样创建标签栏控制器:

// Create a tabbar controller and an array to contain the view controllers
UITabBarController *tabBarController = [[UITabBarController alloc] init];
tabBarController.delegate = self;

NSMutableArray *localViewControllersArray   = [[NSMutableArray alloc] init];

//  Setup first view and nav controllers
UIViewController *vc1 = [[UIViewController alloc] init];
UINavigationController *nc1 = [[UINavigationController alloc] initWithRootViewController:vc1];
[localViewControllersArray addObject:nc1];

//  Setup second view and nav controllers
UIViewController *vc2 = [[UIViewController alloc] init];
UINavigationController *nc2 = [[UINavigationController alloc] initWithRootViewController:vc2];
[localViewControllersArray addObject:nc2];

// set the tab bar controller view controller array to the localViewControllersArray
tabBarController.viewControllers = localViewControllersArray;

[self.window setRootViewController:tabBarController];

【讨论】:

  • 在我的应用程序中,导航层次结构中的根视图控制器是单个视图 ViewController。从那里我有一个标签栏控制器。所以我不确定这对我有用。因此,我没有在 AppDelegate 中设置 TabBarController,而是直接将其拖到 stroyboard 中。
  • 在您的情况下,您可以做同样的事情,但只需在需要时推动标签栏控制器,但标签中的视图控制器仍应处理自己的导航栏配置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
相关资源
最近更新 更多