4 Stimmen

Wie erhält man untergeordnete View-Controller von UIMoreListController (einer privaten Framework-Klasse)?

Ich bin neugierig, wenn es eine legitime API, mit denen die Ansicht-Controller zu erhalten, die Kinder von einem sind UIMoreListController ? (Der UIMoreListController ist das Kind am oberen Ende des UIMoreNavigationController-Ansichtsstapels. Der UIMoreNavigationController ist das Objekt, auf das die moreNavigationController Eigenschaft einer UITabBarController .)

Mit anderen Worten, wenn ich einen UITabBarController habe und ihm ein Array von sechs Viewcontrollern zuordne, sieht die Viewhierarchie wie folgt aus (es ist eigentlich eine Hierarchie von Views, nicht von Viewcontrollern, aber die Verwendung dieser Bezeichner macht mehr Sinn):

+ 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

Eine Möglichkeit, dies zu tun, besteht darin, einfach die View-Controller aus dem UITabBarController's viewControllers Eigenschaft, prüft, ob es mehr als 5 gibt, und gibt alle View-Controller von Index 5 bis N - 1 wenn es mehr als 5 gibt. (Wenn es weniger als 5 gibt, dann sind keine Viewcontroller Kinder des UIMoreNavigationController).

Ich möchte jedoch die Hardcodierung von Annahmen über die Anzahl von Viewcontrollern vermeiden, die ein UITabBarController anzeigen wird, bevor er die verbleibenden Controller in der moreNavigationController . Apple könnte diese Zahl in Zukunft ändern. Aber ich kann weder bei UITabBarController noch bei UINavigationController eine API finden, mit der ich auf diese Kinder zugreifen kann, und UIMoreNavigationController ist keine öffentliche Klasse, so dass ich mich nicht auf die Methoden dieser Klasse verlassen kann.

3voto

erikprice Punkte 6139

Ich habe immer noch keine echte API gefunden, um dies zu erreichen. Es kann jedoch getan werden, ohne Annahmen zu treffen, die auf der Überprüfung der UIUserInterfaceIdiom und geht von maximal 5 oder 8 Tabs aus. Es ist ein bisschen hässlich, ein bisschen einfach:

  1. Ermitteln Sie die Anzahl der Elemente in der Registerkartenleiste. UITabBarController.tabBar.items enthält den Eintrag in der Registerkarte für die moreNavigationController wenn es ein solches Element in der Registerkarte gibt.
  2. Zählt die Anzahl der Viewcontroller im UITabBarController. Wenn es mehr Viewcontroller im UITabBarController gibt als Registerkarten-Elemente, dann stellt das letzte Registerkarten-Element die moreNavigationController .
  3. Verringern Sie daher die Anzahl der Registerkartenelemente um eins (um die moreNavigationController ) und das ist der Index des ersten Kindes der moreNavigationController innerhalb UITabBarController.viewControllers .

Oder, in Code:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X