如何获取UIMoreListController(私有框架类)的子视图控制器?

时间:2011-10-18 18:46:58

标签: ios cocoa-touch uiviewcontroller uitabbarcontroller

我很好奇是否有合法的API来获取UIMoreListController的子视图控制器? (UIMoreListController是UIMoreNavigationController视图堆栈顶部的子节点.UIMoreNavigationController是moreNavigationController的{​​{1}}属性指向的对象。)

换句话说,如果我有一个UITabBarController并且我在其上设置了六个视图控制器的数组,那么视图层次结构实际上看起来就像这样(它实际上是视图的层次结构,而不是视图控制器,但使用这些标识符会产生更多义):

UITabBarController

这样做的一种方法是简单地从UITabBarController的+ UITabBarController <-- has five tabs |--- view controller <-- these are my own view controllers |--- view controller |--- view controller |--- view controller |--+ UIMoreNavigationController <-- root view controller of fifth tab |--+ UIMoreListController <-- table-based view shown on fifth tab |--- view controller <-- these are my own view controllers |--- view controller 属性中获取视图控制器,检查是否有超过5个,并将所有视图控制器从索引5返回到viewControllers如果有超过5个。(如果小于5,则没有视图控制器将是UIMoreNavigationController的子节点。)

但是,我想避免硬编码任何有关UITabBarController在列出N - 1中剩余控制器之前将显示的视图控制器数量的假设。 Apple可能会在未来改变这个数字。但我无法在UITabBarController或UINavigationController上找到任何API来访问这些子节点,而UIMoreNavigationController不是公共类,因此我不能依赖于该类上公开的任何方法。

1 个答案:

答案 0 :(得分:3)

我还没有找到真正的API来完成这个。但是,可以在不基于检查UIUserInterfaceIdiom并假设最多5或8个选项卡的假设的情况下完成。这有点丑陋,有点简单:

  1. 获取标签栏中的项目数。如果有这样的标签栏项目,UITabBarController.tabBar.items将包含moreNavigationController的标签栏项目。
  2. 计算UITabBarController中的视图控制器数量。如果UITabBarController中的视图控制器多于标签栏项,则最后一个标签栏项代表moreNavigationController
  3. 因此,将标签栏项目的数量减1(以考虑moreNavigationController),这是moreNavigationControllerUITabBarController.viewControllers的第一个孩子的索引。
  4. 或者,在代码中:

    NSUInteger tabCount = [tabBarController.tabBar.items count];
    NSUInteger vcCount = [tabBarController.viewControllers count];
    NSUInteger idx = (vcCount > tabCount) ? tabCount - 1 : 0;
    NSIndexSet *is = [NSIndexSet indexSetWithRange:NSMakeRange(idx, vcCount - idx)];
    NSArray *moreControllers = [tabBarController.viewControllers objectsAtIndexes:is];