Как получить дочерние контроллеры представления UIMoreListController (частный каркасный класс)? - PullRequest
4 голосов
/ 18 октября 2011

Мне любопытно, существует ли законный API, с помощью которого можно получить контроллеры представления, являющиеся потомками UIMoreListController?(UIMoreListController является дочерним элементом в верхней части стека представлений UIMoreNavigationController. UIMoreNavigationController - это объект, на который указывает свойство moreNavigationController 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

Один из способов сделать это - просто получить контроллеры представлений из свойства viewControllers UITabBarController, проверить, не превышает ли их 5, и вернуть все контроллеры представлений из индекса 5 в N - 1, если их больше 5.(Если их меньше 5, то никакие контроллеры представлений не будут дочерними для UIMoreNavigationController.)

Однако я хотел бы избежать жесткого кодирования любых предположений о количестве контроллеров представлений, которые UITabBarController будет отображать перед перечислениемостальные контроллеры в moreNavigationController.Apple может изменить это число в будущем.Но я не могу найти ни API ни в UITabBarController, ни в UINavigationController, с помощью которого можно получить доступ к этим дочерним элементам, а UIMoreNavigationController не является публичным классом, поэтому я не могу полагаться на любые методы, представленные в этом классе.

1 Ответ

3 голосов
/ 31 августа 2012

Я до сих пор не нашел реального API для этого. Тем не менее, это можно сделать, не делая предположений, основываясь на проверке UIUserInterfaceIdiom и допуская максимум 5 или 8 вкладок. Это некрасиво, вроде просто:

  1. Получить количество элементов на панели вкладок. UITabBarController.tabBar.items будет включать элемент панели вкладок для moreNavigationController, если есть такой элемент панели вкладок.
  2. Подсчитать количество контроллеров представления в UITabBarController. Если в UITabBarController больше контроллеров представления, чем элементов панели вкладок, то последний элемент панели вкладок представляет moreNavigationController.
  3. Поэтому уменьшите количество элементов панели вкладок на единицу (для учета moreNavigationController), и это будет индекс первого потомка moreNavigationController в UITabBarController.viewControllers.

Или, в коде:

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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...