2016-12-13 2 views
1

Ich entwickle eine Anwendung basierend auf UITabbar und die View-Hierarchie wie folgt.Zugriff auf UIViewController von UITabBarController und UINavigationController

UITabBarController ----> UINavigationController ----> UIViewController

ich Push-Benachrichtigung Nutzlast haben, die spezifische UIViewController öffnet, kann ich ausdrücklich offen UIViewController direkt View-Controller-Storyboard-ID, aber tabBar und Navbar gewonnen‘ t zeigen. Wie kann ich zu bestimmten View Controller gehen und TabBar und NavController von AppDelegate didReceiveRemoteNotifications anzeigen.

Danke!

+0

Könnten Sie meine Antwort überprüfen? –

+0

sicher, ich habe noch ein paar Fragen für Sie @FedericoMalagoni – chronycles

Antwort

1

Sie haben alle Ihre VC zu instanziiert und alle von ihnen als Wurzel seines Vorgängers: programmatisch

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    let mainStoryboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    let yourVC = mainStoryboard.instantiateViewControllerWithIdentifier("YourVC_Identifier"); 
    let yourNavController = mainStoryboard.instantiateViewControllerWithIdentifier("YourNAV_Identifier") as! UINavigationController 
    let yourTabController = mainStoryboard.instantiateViewControllerWithIdentifier("YourTAB_Identifier") as! UITabBarController 

    yourNavController.setViewControllers([yourVC], animated: false) 
    yourTabController.setViewControllers([yourNavController], animated: false) 


    self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
    self.window?.rootViewController = yourTabController 
    self.window?.makeKeyAndVisible() 



    return true 
} 
+0

hi @Federico Malagoni, deine Antwort ist genial, der Code funktioniert wie ich erwartet habe, aber es scheint, als ob ich popToRootViewController nicht verwenden kann, nachdem der VC initiiert wurde. Warum das? – chronycles

+0

Ich habe deine Frage nicht verstanden. Könnten Sie eine neue Frage stellen? –

0

[[UIApplication sharedApplication] keyWindow] hat eine Eigenschaft .rootViewController. Vermutlich ist das Ihre Tab-Leiste. Auf diesem Controller können Sie die aktive Registerkarte festlegen und View-Controller mit der Eigenschaft .viewControllers ausschalten. Nun vorausgesetzt, eine dieser ist Ihre UINavigationController, die auch eine Eigenschaft .rootViewController haben sollte. Instanziieren Sie vom Storyboard und setzen Sie entweder den Root oder schieben Sie den View-Controller auf den Navigationscontroller.

+0

könnten Sie bitte den Pseudocode in Swift zeigen? Danke – chronycles

0

die Hierarchie aus dem App Delegierter Folgen. Wenn Ihr Einstiegspunkt vom Storyboard stammt, richten Sie in Ihrem UIWindow eine AppDelegate ein, so dass Sie die UITabBarController wie folgt einstellen können.

//self.tabBarController is you TabBar from Storyboard, or programatically initialized 
self.window.rootViewController = self.tabBarController; 

Dann, wenn Sie eine Benachrichtigung in didReceiveRemoteNotifications Art der Benachrichtigung aus nach Typ, und die View-Controller finden:

//Let's say the View Controller being accessed is in the first position of the stack of viewcontroller from UITabBarController & UINavigationController 
UINavigationController *navViewController = self.tabBarController.viewControllers.firstObject; 
UIViewController *accessedViewController = navViewController.viewcontroller.firstObject; 
Verwandte Themen