UIMoreNavigationController和UITabBarController的问题

时间:2012-02-24 12:02:56

标签: ios ios5 uitabbarcontroller uitabbar

这个问题困扰了我一段时间,但我想我终于找出了什么是错的;我我现在只需要一个解决方案......

这是应用程序的背景。用户可以使用大约6个不同的选项卡,使用UITabBarController显示。这些选项卡中的每一个都是UINavigationController内的自定义UIViewController子类。所有6个选项卡都在nib文件(MainWindows.xib)中设置。

我需要能够隐藏和显示不同的标签,具体取决于用户是否登录,以及他们登录的对象。我有这样的工作:

在应用启动时(应用程序:didFinishLaunching:...),六个选项卡存储在我拥有的NSMutableArray中。这很好用......

当用户登录或注销时,我从NSMutableArray访问他可以使用的标签,并将它们添加到UITabBarController中,如下所示:

[tabBar setViewControllers: [NSArray arrayWithObjects:
                                      [viewControllers objectAtIndex:1],
                                      [viewControllers objectAtIndex:5],
                                      nil] animated:YES];

viewControllers是我之前用6个标签制作的NSMutableArray。在我创建它之后立即对它进行NSLog,这就是我所期望的:

2012-02-24 11:45:57.690 [redacted][26155:207] (
    "<UINavigationController: 0x8249db0>",
    "<UINavigationController: 0x841a3f0>",
    "<UINavigationController: 0x824be40>",
    "<UINavigationController: 0x824dbd0>",
    "<UINavigationController: 0x824e810>",
    "<UINavigationController: 0x841dfb0>"
)

但是,当我从最后一个自定义视图控制器(该列表中的最后一个导航控制器内)打印self.parentViewController的值时,我得到了这个:

2012-02-24 11:54:51.247 [REDACTED][26306:207]  <UIMoreNavigationController: 0x826ab00>
2012-02-24 11:54:51.248 [REDACTED][26306:207]  <UITabBarController: 0x8257c50>

第一行是self.parentViewController,第二行是self.parentViewController.parentViewController

这似乎表明heirachy是:

UITabBarController - &gt; UIMoreNavigationController - &gt; MyCustomController

然而,当我打印[self.parentViewController.parentViewController viewControllers]

我仍然得到:

(
    "<UINavigationController: 0x8259770>",
    "<UINavigationController: 0x825aa60>",
    "<UINavigationController: 0x825bec0>",
    "<UINavigationController: 0x82612c0>",
    "<UINavigationController: 0x8261ec0>",
    "<UINavigationController: 0x8263b00>"
)

UIMoreNavigationController去了哪里?谁能解释一下发生了什么?我遇到了与此相关的问题因为我使用了那个数组,但是最后一个UINavigationController不是它声称的对象。

我有一种预感,苹果正在摆弄幕后的物品,以便让程序员更容易......

我会尝试回答您对代码结构,我如何使用不同对象或测试某些代码的任何问题。非常感谢你提前。

3 个答案:

答案 0 :(得分:4)

实际上Tabbar的moreViewController是UIMoreNavigationController。 (您可以查看private header on GitHub

正如文档所述,viewController属性只包含已添加到标签栏的viewControllers:You must also not look for the More navigation controller in the array of view controllers stored in the viewControllers property. The tab bar controller does not include the More navigation controller in that array of objects.

请参阅此处的文档:UITabbarViewController

无论如何我不明白,你的问题到底是什么。如果您需要通过UIMoreNavigationController的{​​{1}}属性访问moreNavigationController

但'viewControllers'属性始终只保存那些已添加到TabBar的ViewControllers。

答案 1 :(得分:1)

既然你没有说出你的实际问题是什么,我就不能说出来。但我很确定没有UIMoreNavigationController这样的课程。 “更多”导航控制器只是由UINavigationController管理的UITabBarController来保存任何多余的子控制器。请参阅Apple的UITabBarController reference,但您也可以仔细检查UIKit框架头文件UITabBarController.h

相应地,我无法在显示<UIMoreNavigationController: 0x826ab00>的位置重现您的调试输出。在我的环境(SDK 5.0)中,无论是检查自定义视图控制器的父级还是标签栏控制器的子级,我都会得到<UINavigationController: 0x12345678>

答案 2 :(得分:1)

只是为了确认一个有同样的问题。我相信使用setViewController:在UITabBarController创建UIMoreNavigationController的情况下会被破坏。问题是,当更改标签栏的视图控制器时,导航控制器的维护越多 - 控制器层次结构就越来越糟。我已向Apple提交了一个错误但尚未收到回复。

  • 哈拉尔德