具有标签栏和导航栏的 iPhone 应用程序

Posted

技术标签:

【中文标题】具有标签栏和导航栏的 iPhone 应用程序【英文标题】:iPhone app with tab bar and navigation bar as peers 【发布时间】:2010-04-15 06:08:55 【问题描述】:

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

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

目前,我有一个 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】:

哎呀。你在这里是一筹莫展。当您尝试以非标准方式使用它们时,我已经了解到 UINavigationController 和 UITabBarController 不太适应的艰难方式。 UINavigationBar 和 UITabBar 并非设计为在视图层次结构中作为兄弟姐妹共存。他们真的很想成为远房表亲。也许您所追求的方法可以以某种方式起作用,但我个人甚至不会尝试。

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

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

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

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

    在每个选项卡下都有一个单独的 UINavigationController,每个选项卡都有自己的导航栏。 (这是同时使用 UINavigationController 和 UITabBarController 的标准方式。)

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

    在“主页”视图控制器上选择一行后,切换到相关的内容选项卡。

    在您的 UITabBarController 上设置一个委托。在其 tabBarController:didSelectViewController 方法中,调用 pushViewController:animated:。这类似于您当前正在执行的操作,只是您将在 (UINavigationController *)tabBarController.selectedViewController 上调用它。

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

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

【讨论】:

我想我可以按照你的方式做事。我想出了一个使用“裸” UINavigationBar 和 UITabBar 的潜在解决方案,但实施起来太麻烦了。我会在我有工作的时候回来报告。

以上是关于具有标签栏和导航栏的 iPhone 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

通过标签栏和按钮导航屏幕

以编程方式更改标签栏和导航栏的颜色

移动开发中导航栏和搜索栏在设计中应该注意哪些问题?

全屏 UIImage 视图

如何创建一个带有导航栏和三个详细视图的应用程序?

如何在 iPhone 中基于导航的应用程序中添加标签栏