Ich weiß, dass ich die navigationController
-Eigenschaft, die ich für meine App eingerichtet habe, verwenden kann, um den aktuellen View-Controller vom App-Delegaten zu erhalten. Es ist jedoch an vielen Stellen in meiner App möglich, dass ein modaler Navigationscontroller präsentiert wurde. Gibt es eine Möglichkeit, dies über den Anwendungsdelegaten zu erkennen, da der aktuelle Navigationscontroller sich von dem unterscheidet, an dem der Anwendungsdelegat eine Referenz enthält?
Basierend auf dem Stichwort hier habe ich eine Kategorie erstellt, um den obersten View-Controller zu erhalten, so dass% co_de aufgerufen wird Mit% erhalten Sie den obersten View-Controller in Ihrer App.
Dies ist besonders nützlich in iOS 8, wo [[UIApplication sharedApplication] topMostViewController]
und UIAlertView
zugunsten von UIActionSheet
veraltet sind, was auf dem obersten View-Controller angezeigt werden muss.
Das hat für mich funktioniert. Ich habe viele Ziele mit unterschiedlichen Controllern, daher schienen vorherige Antworten nicht zu funktionieren.
Zuerst möchten Sie dies in Ihrer AppDelegate-Klasse einfügen:
%Vor%dann, in Ihrer Funktion
%Vor%Tolle Lösung in Swift, in AppDelegate implementieren
%Vor%Ziel - C
%Vor%Wenn Sie den Navigationscontroller im App-Delegaten haben, verwenden Sie einfach die visibleViewController Eigenschaft. Es wird Ihnen den sichtbaren Controller geben, auch wenn es modal ist.
Die beste Lösung, funktioniert auch mit moreNavigationController
in UITabBarController
:
Andere oben genannte Lösungen funktionieren nur teilweise, da komplexe Ansichtshierarchien nicht behandelt werden (Navigationscontroller, integriert in Registerkarten-Controller, Split-View-Controller, View-Container und auch Alarm-Controller könnten Dinge vermasseln).
Ich löse das, indem ich eine Referenz des aktuellen View-Controllers einchecke AppDelegieren. Jedes Mal, wenn die Ansicht erscheint, nutze ich
viewDidAppear(animated:)
und setze den Verweis im App-Delegaten.
Ich weiß, dass die Frage über Objective-C lautete, aber ich kann nur Swift-Code bereitstellen und bin mir sicher, dass es für beide Arten von Benutzern nützlich sein wird.
Erstens: Ich habe ein Protokoll implementiert, um die Dinge sauber und wiederverwendbar zu halten:
%Vor%Zweitens: Ich habe einen Verweis auf AppDelegate hinzugefügt:
%Vor%Drittens: Ich setze den aktuellen View-Controller in viewDidAppear ():
%Vor%Vierte:
%Vor%Tags und Links objective-c ios delegates appdelegate