无法从Tab Bar控制器访问导航栏

时间:2014-12-17 17:42:11

标签: ios xcode uinavigationcontroller storyboard uitabbarcontroller

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

  1. 嵌入导航控制器的根单视图控制器(从左侧,屏幕截图中的第二个视图)(从左侧,屏幕截图中的第一个视图)。
  2. 标签栏控制器(从左侧,从根vc
  3. 访问的屏幕截图中的第三个视图)
  4. 2位于标签栏控制器中的视图控制器(屏幕截图中最右侧的2个视图)和 貌似 也仍位于导航栏控制器中。
  5. 每个标签栏控制器都会显示一个导航栏(如右图2所示)。有效的逻辑是,当我按下根上的按钮时,标签栏控制器会打开。您可以通过选项卡栏在选项卡之间导航,然后按导航栏中的后退按钮返回到根目录。

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

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

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

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

    tab/navigation controllers

2 个答案:

答案 0 :(得分:3)

我找到了办法:

在由标签栏控制器管理的每个视图控制器中,我将其添加到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的建议,但如果我这样做,我会回来注意结果。

答案 1 :(得分:0)

在每个视图控制器的viewDidLoad方法中,您应该这样做(根据需要更改@“联系人”的标题:

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];