2010-12-04 13 views
9

Das Hauptfenster meiner Anwendung enthält einen xib-basierten UITabBarController (vollständig in Interface Builder konfiguriert), der auch modal präsentiert werden kann (ähnlich wie die Music.app "Modesuche zur Playlist hinzufügen") . Der UITabBarController enthält eine Reihe von UINavigationControllern, die wiederum untergeordnete UITableViewControllers enthalten. Dies ist, wie ich Erfassen, wenn die gegenwärtig subclassed UITableViewController innerhalb eines modalen UITabBarController präsentiert wird:Ermitteln, ob ein UIViewController modal präsentiert wird

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.isModal = NO; 

    UIViewController *child  = self; 
    UIViewController *parent = self.parentViewController; 
    while (parent) { 
     if (parent.modalViewController && parent.modalViewController == child) { 
      self.isModal = YES; 
      break; 
     } 
     child = parent; 
     parent = parent.parentViewController; 
    } 

    if (self.isModal) { 
     // modal additions, eg. Done button, navigationItem.prompt 
    } 
    else { 
     // normal additions, eg. Now Playing button 
    } 
} 

Gibt es eine Möglichkeit, dies zu tun, ist nicht mit dem parent Baum zu Fuß nach oben oder Subklassen aller Zwischenansicht Controller, um den isModal-Zustand weiterzugeben, wenn sie initialisiert werden?

Antwort

4

Got an answer on Twitter. Ich endete mit der Unterklasse UITabBarController und fügte eine BOOL isModal Instanzeigenschaft hinzu, die bei modaler Darstellung auf YES gesetzt wird. Dann können Teilansichten self.tabBarController mit einer Umwandlung in die Unterklasse verwenden, um auf die-Eigenschaft zuzugreifen und entsprechend zu rendern/sich zu verhalten.

+3

Umwandlung in Unterklasse. Das scheint peinlich zu sein. Warum Unterklasse? Warum nicht eine Kategorie zu UITabBarController hinzufügen, die isModal enthält? –

1

Sie können den Anzeigezustand in einem benutzerdefinierten Initialisierer festlegen, wenn Sie die Ansicht präsentieren. Ich meine, der Code, der es präsentiert, wird wissen, wie es präsentiert wird, oder?

- (void)initInModalMode:(BOOL)isModal 

Es ist besser, als die Ansicht rückblickend nachträglich ihren Status zu entdecken?

+0

Es weiß, es ist ein UITabBarController präsentiert, aber es weiß nicht, den subclassed UITableViewController präsentiert (das durch eine der vielen Zwischen UINavigationControllers dargestellt wird durch die UITabBarController vorgelegt), der braucht eigentlich zu wissen, ob es präsentiert wird modally oder nicht. Müsste diese Herangehensweise es nicht erforderlich machen, dass ich alle ansonsten vorhandenen Zwischenansichts-Controller ableiten würde, um sicherzustellen, dass der isModal-Wert die erforderliche Ansicht erhält? –

2

Ich würde versuchen, den Root-View-Controller zu bekommen und zu überprüfen, ob er einen Modal-View-Controller hat. Sie können diesen Ansichtscontroller von UIWindow abrufen. Beachten Sie auch, dass Sie die Hierarchie des aktuellen Ansichtscontrollers mit der viewControllers-Eigenschaft von UINavigationController durchlaufen können: for (UIViewController * viewController in self.navigationController.viewControllers) {...} ist schneller und einfacher.

+0

Ich verstehe nicht, wie jeder Vorschlag zu meiner Frage (nicht zu sagen, dass sie nicht, ich verstehe nicht). Wenn eine Schaltfläche in UIWindow> UITabBarController> UINavigationBarController> ACustomTableViewController die gleiche UITabBarController-Hierarchie modal darstellt, wie weiß der Root-UITabBarController-Controller in UIWindow, was passiert? In Bezug auf self.navigationController.viewControllers enthält das nicht nur die Hierarchie innerhalb der aktuellen NavigationController? Wie hilft mir das in der modalen Ansicht, die eine separate Instanz des gleichen UITabBarController präsentiert? –

+0

Wenn Sie Ihren UITabBarController laden, wenn Sie den rootViewController des aktuellen UIWindow verwenden, wird die Schaltfläche "Fertig" nicht auf der Benutzeroberfläche angezeigt. Andernfalls wird es über dem rootViewController (wahrscheinlich modal, aber Sie sollten überprüfen, um sicher zu sein). Sie denken in Bezug auf die aktuelle Ansichtshierarchie ... – chockenberry

+0

Der andere Kommentar über Iteration durch View-Controller war nur, um Ihnen zu zeigen, dass Sie musste nicht nach Eltern usw. suchen. Es hilft nicht bei dem Problem zu wissen, ob du modal bist oder nicht. – chockenberry

10

Wenn Sie eine Suche nach iOS 6+, wird diese Antwort ist veraltet und Sie sollten Gabriele Petronella's answer


prüfe ich vor eine sehr ähnliche Frage eine Weile beantwortet, wo ich eine Funktion, ob das zu bestimmen, Stromregler ist als modal dargestellt oder nicht, ohne dass hier die Tab-Leiste Controller, Unterklasse:

Is it possible to determine whether ViewController is presented as Modal?

Am ursprünglichen answ er gibt es einige grundlegende Erklärungen darüber, wie diese Funktion funktioniert und Sie es CANcheck, wenn nötig, aber hier ist es

-(BOOL)isModal { 

    BOOL isModal = ((self.parentViewController && self.parentViewController.modalViewController == self) || 
      //or if I have a navigation controller, check if its parent modal view controller is self navigation controller 
      (self.navigationController && self.navigationController.parentViewController && self.navigationController.parentViewController.modalViewController == self.navigationController) || 
      //or if the parent of my UITabBarController is also a UITabBarController class, then there is no way to do that, except by using a modal presentation 
      [[[self tabBarController] parentViewController] isKindOfClass:[UITabBarController class]]); 

    //iOS 5+ 
    if (!isModal && [self respondsToSelector:@selector(presentingViewController)]) { 

     isModal = ((self.presentingViewController && self.presentingViewController.modalViewController == self) || 
      //or if I have a navigation controller, check if its parent modal view controller is self navigation controller 
      (self.navigationController && self.navigationController.presentingViewController && self.navigationController.presentingViewController.modalViewController == self.navigationController) || 
      //or if the parent of my UITabBarController is also a UITabBarController class, then there is no way to do that, except by using a modal presentation 
      [[[self tabBarController] presentingViewController] isKindOfClass:[UITabBarController class]]); 

    } 

    return isModal;   

} 
4

Seit iOS5 können Sie auch isBeingPresented auf einem Viewcontroller-Instanz verwenden:

- (BOOL)isModalViewController 
{ 
    return [self isBeingPresented]; 
} 
0

Es gibt einen viel einfacheren Weg in diesen schnellen Tagen.

extension UIViewController { 

    var isPresentedModally: Bool { 
     return presentingViewController?.presentedViewController == self || parent?.isPresentedModally == true 
    } 

} 
Verwandte Themen