带有标签栏和导航栏的iPhone应用程序作为同行

时间:2010-04-15 06:08:56

标签: iphone uinavigationcontroller uitabbarcontroller

我正在尝试编写一个使用导航栏和标签栏的应用程序(我正在收集)是一种不同寻常的方式。

基本上,我有几个“页面”(“主页”,“设置”等),每个页面都有自己的标签。我也想拥有它,以便“主页”页面是导航栏的根视图,其他页面是导航栏的第二级视图。也就是说,我应该能够通过单击相应的选项卡栏导航到任何页面,并且应该能够通过单击导航栏的后退按钮从任何其他页面导航到主页。

目前,我有一个UINavigationBar(通过UINavigationController)和一个UITabBar(通过UITabController)作为UIView的子级。各个页面的视图控制器被设置为选项卡控制器的viewControllers属性,主页的控制器也被设置为导航控制器的根视图。每个页面视图的标记都设置为选项卡控件中的索引。我在选项卡控制器的didSelectViewController委托方法中有以下逻辑:

- (void) tabBarController:(UITabBarController*) tabBarController
    didSelectViewController:(UIViewController*) viewController
{
    if ([navController.viewControllers count] > 1)
        [navController popViewControllerAnimated:NO];

    [navController pushViewController:viewController animated:YES];
}

此外,在导航控制器的didShowViewController委托方法中,我有以下代码:

- (void) navigationController:(UINavigationController *) navigationController
    didShowViewController:(UIViewController *)viewController
    animated:(BOOL)animated
{
    tabController.selectedIndex = viewController.view.tag;
}

正在发生的问题是,当我运行它时,导航栏,标签栏和主页都显示正常,但标签栏不会响应输入 - 我无法选择其他标签。

我认为将标签栏作为导航控件的子项更为常见,反之亦然。这似乎不适合我的方法,因为我不希望每次在父控件中发生更改时单独创建从属控件 - 例如:每次导航栏更改时重新创建标签栏。

有没有人对错误以及如何解决这个问题提出建议?我可能错过了一些明显的东西,但不管它是什么我似乎无法找到它。谢谢!

编辑:我猜这与控制器试图拥有页面控制器的所有权有关,但我不能为我的生活找到解决方法。

1 个答案:

答案 0 :(得分:1)

让人惊讶。你在这里走出困境。当你尝试以非标准方式使用它们时,我已经学会了UINavigationController和UITabBarController不太适应的困难方式。 UINavigationBar和UITabBar并非设计为在视图层次结构中作为兄弟姐妹共存。他们真的想成为远古表兄弟。也许你所追求的方法可以以某种方式工作,但我个人甚至都不会尝试。

话虽如此,我建议你可以检查一件事,然后我会告诉你我是如何处理这个问题的。

你实现了吗?你是否从tabBarController返回YES:shouldSelectViewController:在你的UITabBarControllerDelegate中?如果没有,那将阻止您的标签切换。

假设这不会解决你所有的问题,我会采取以下措施来获得你所寻求的行为:

  1. 创建一个UITabBarController,并将其视图设置为窗口的根视图。

  2. 在每个标签下都有一个单独的UINavigationController,每个标签都有自己的导航栏。 (这是一起使用UINavigationController和UITabBarController的标准方法。)

  3. 设置一个UITableViewController,它显示主菜单表的相同副本,作为每个导航控制器的根视图控制器。

  4. 如果在“主页”视图控制器上选择了一行,请切换到关联的内容标签。

  5. 在UITabBarController上设置委托。在其tabBarController:didSelectViewController方法中,调用pushViewController:animated:。这与你现在正在做的类似,除了你将在(UINavigationController *)tabBarController.selectedViewController上调用它。

  6. 在内容标签的根视图控制器的viewDidAppear:animated中,切换到“主页”标签。这样,当用户点击后退按钮返回“Home”时,它将切换到右侧选项卡。 (当用户第一次选择内容选项卡时,您可能还需要使用条件代码来防止这种情况发生。我不确定。)

  7. 我很想知道Apple是否接受这种非标准行为。回来告诉我们。另外,如果您的方法以某种方式工作,请告诉我们。