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

我很好奇,如果有一个合法的API来获得作为UIMoreListController孩子的视图控制器? (UIMoreListController是UIMoreNavigationController视图堆栈顶部的子元素,UIMoreNavigationController是UITabBarControllermoreNavigationController属性指向的对象。

换句话说,如果我有一个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 

一种方法是简单地从UITabBarController的viewControllers属性中获取视图控制器,检查是否有多于5,并且如果多于5,则将所有视图控制器从索引5返回到N - 1 。(如果有less于5,那么视图控制器将不会是UIMoreNavigationController的子项。)

不过,我想避免在列出moreNavigationController的其余控制器之前,对有关UITabBarController将显示的视图控制器数量的任何假设进行硬编码。 苹果可能会在未来改变这个数字。 但是我无法在UITabBarController或UINavigationController上find任何访问这些子项的API,而UIMoreNavigationController也不是公共类,因此我不能依赖该类上公开的任何方法。

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

  1. 获取标签栏中的项目数量。 如果有这样一个标签栏项目, UITabBarController.tabBar.items将包含moreNavigationController的标签栏项目。
  2. 统计UITabBarController中视图控制器的数量。 如果UITabBarController中有更多的视图控制器比标签栏项目,则最后一个标签栏项目代表moreNavigationController
  3. 因此,将标签栏项目的数量减1(以解决moreNavigationController ),这是UITabBarController.viewControllers moreNavigationController的第一个子项的moreNavigationController

或者,在代码中:

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