Ouverture du contrôleur de vue depuis l'app delegate en utilisant swift

j'essaie de créer une notification push qui détermine quelle vue ouvrir en fonction des informations obtenues à partir de la push.

j'ai réussi à obtenir l'information de la poussée, mais je me bats maintenant pour obtenir la vue d'ouvrir

en regardant d'autres questions de débordement de pile, j'ai la suivante:

App Delegate Did finishing loading:

     //Extract the notification data
    if let notificationPayload = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary {
        // Get which page to open
        let viewload = notificationPayload["view"] as? NSString
        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        //Load correct view
        if viewload == "circles" {

            var viewController = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("Circles") as! UIViewController
            self.window?.rootViewController = viewController

                        }
    }

actuellement, cela ne fonctionne pas sur le ver ViewController = self... ligne.

42
demandé sur Lister 2015-06-02 12:41:29

10 réponses

vous devez définir la propriété ViewController StoryBoardId comme ci-dessous image.

enter image description here

open viewController utilisant le codage comme ci-dessous dans swift

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

         let mainStoryboardIpad : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
         let initialViewControlleripad : UIViewController = mainStoryboardIpad.instantiateViewControllerWithIdentifier("Circles") as UIViewController
         self.window = UIWindow(frame: UIScreen.main.bounds)
         self.window?.rootViewController = initialViewControlleripad
         self.window?.makeKeyAndVisible()

         return true
    }
81
répondu Kirit Modi 2017-10-10 05:26:18

Swift 3:

C'est mon approche préférée lorsque vous présentez un nouveau viewController à partir du viewController actuel via L'AppDelegate. De cette façon, vous n'avez pas à détruire complètement votre hiérarchie de vues lors de la manipulation d'une notification push ou d'un lien universel

if let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "someController") as? SomeController {
    if let window = self.window, let rootViewController = window.rootViewController {
        var currentController = rootViewController
        while let presentedController = currentController.presentedViewController {
            currentController = presentedController
        }
        currentController.present(controller, animated: true, completion: nil)
    }
}
29
répondu Quy Bui 2017-02-25 09:50:33

Swift 3

Pour présenter le point de vue avec la manette de navigation:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier :"InboxViewController") as! InboxViewController
let navController = UINavigationController.init(rootViewController: viewController)

   if let window = self.window, let rootViewController = window.rootViewController {
       var currentController = rootViewController
       while let presentedController = currentController.presentedViewController {
           currentController = presentedController
        }
           currentController.present(navController, animated: true, completion: nil)
   }
7
répondu Arvin Sanmuga Rajah 2017-03-22 04:21:56

D'abord initialiser le window

self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let storyBoard = UIStoryboard(name: "Main", bundle: nil)

Pour la configuration de rootViewController à l'intérieur AppDelegate Classe

let viewController = storyBoard.instantiateViewControllerWithIdentifier("Circles") as UIViewController
self.window?.rootViewController = viewController
self.window?.makeKeyAndVisible()
6
répondu iDhaval 2017-07-03 08:31:51

je dirais que créer UIWindow à chaque fois que vous voulez changer rootViewController est une mauvaise idée. Après quelques changements de rootVC (en utilisant la solution supérieure) vous allez avoir beaucoup D'UIWindows dans votre application à la fois.

À mon avis, la meilleure solution est:

  1. Obtenir de nouveaux rootVC: let rootVC = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewControllerWithIdentifier("newRootVCIdentifier") as UIViewController
  2. Définir le cadre pour les nouveaux rootVC de UIScreen de limites: rootVC.view.frame = UIScreen.mainScreen().bounds
  3. définir un nouveau contrôleur root pour la fenêtre courante (ici avec l'animation)): UIView.transitionWithView(self.window!, duration: 0.5, options: .TransitionCrossDissolve, animations: { self.window!.rootViewController = rootVC }, completion: nil)

Fait!

Vous n'avez pas besoin de la méthode window?.makeKeyAndVisible(), parce que cette solution fonctionne sur la fenêtre de l'application courante.

3
répondu Marcin Biliński 2017-02-28 19:27:33

Swift 3 SWRevealViewController

    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyBoard = UIStoryboard(name: "Main", bundle: nil)

    let viewController = storyBoard.instantiateViewController(withIdentifier: "SWRevealViewController") as! SWRevealViewController
    self.window?.rootViewController = viewController
    self.window?.makeKeyAndVisible()
3
répondu Anil 2018-01-02 06:38:45

Dans Swift 3

        let mainStoryboardIpad : UIStoryboard = UIStoryboard(name: StorybordName, bundle: nil)
        let initialViewControlleripad : UIViewController = mainStoryboardIpad.instantiateViewController(withIdentifier: identifierName) as UIViewController
        if let navigationController = self.window?.rootViewController as? UINavigationController
        {
            navigationController.pushViewController(initialViewControlleripad, animated: animation)
        }
        else
        {
            print("Navigation Controller not Found")
        }
2
répondu Rob-4608 2018-01-02 17:44:33
let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let destinationViewController = storyboard.instantiateViewController(withIdentifier: "LandVC") as! LandingPageVC

    destinationViewController.webpageURL = NotificationAdvertisement._htmlpackagePath
    destinationViewController.adID = NotificationAdvertisement._adID
    destinationViewController.toneID = NotificationAdvertisement.toneID

    let navigationController = self.window?.rootViewController as! UIViewController

    navigationController.showDetailViewController(destinationViewController, sender: Any?.self)
1
répondu harsh shah 2018-01-23 14:44:09

Il y a une swift 4 version

func application(_ application: UIApplication, 
didFinishLaunchingWithOptions launchOptions: 
[UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let mainStoryboardIpad : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewControlleripad : UIViewController = mainStoryboardIpad.instantiateViewController(withIdentifier: "Circles") as UIViewController
            self.window = UIWindow(frame: UIScreen.main.bounds)
            self.window?.rootViewController = initialViewControlleripad
            self.window?.makeKeyAndVisible()

return true}
0
répondu jack yang 2018-07-09 12:25:58

SWIFT 4

let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let destinationViewController = storyboard.instantiateViewController(withIdentifier: "LandVC") as! LandingPageVC

    destinationViewController.webpageURL = NotificationAdvertisement._htmlpackagePath
    destinationViewController.adID = NotificationAdvertisement._adID
    destinationViewController.toneID = NotificationAdvertisement.toneID

    let navigationController = self.window?.rootViewController as! UIViewController

    navigationController.showDetailViewController(destinationViewController, sender: Any?.self)
0
répondu Sachin Rasane 2018-09-28 06:40:20