it-swarm.com.de

View Controller vom App-Delegaten mit swift öffnen

Ich versuche, eine Push-Benachrichtigung zu erstellen, die bestimmt, welche Ansicht gemäß den vom Push erhaltenen Informationen geöffnet wird.

Ich habe es geschafft, die Informationen aus dem Push zu erhalten, aber ich habe jetzt Schwierigkeiten, die Sicht zu öffnen

Bei anderen Fragen zum Stack-Überlauf habe ich derzeit Folgendes:

App Delegate hat das Laden beendet:

     //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

                        }
    }

Derzeit schlägt dies in der Zeile var ViewController = self ... fehl.

47
Lister

Sie müssen die ViewController StoryBoardId-Eigenschaft wie unter image festlegen.

enter image description here

Öffnen Sie viewController mit der in Swift beschriebenen Codierung

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
    }
87
Kirit Modi

Swift 3:

Dies ist mein bevorzugter Ansatz, wenn ein neuer viewController aus dem aktuellen viewController über AppDelegate präsentiert wird. Auf diese Weise müssen Sie Ihre View-Hierarchie nicht vollständig abbauen, wenn Sie eine Push-Benachrichtigung oder eine universelle Verbindung verwenden

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)
    }
}
35
Quy Bui

Swift 3

So zeigen Sie die Ansicht zusammen mit dem Navigationscontroller an:

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)
   }
8

Initialisieren Sie zuerst die window

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

Zur Einstellung von rootViewController in AppDelegate Class

let viewController = storyBoard.instantiateViewControllerWithIdentifier("Circles") as UIViewController
self.window?.rootViewController = viewController
self.window?.makeKeyAndVisible()
7
iDhaval

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
Anil

Ich würde sagen, dass das Erstellen von UIWindow jedes Mal, wenn Sie rootViewController ändern möchten, eine schlechte Idee ist. Nach ein paar Änderungen von rootVC (mit der oberen Lösung) haben Sie auf einmal viele UIWindows in Ihrer App.

Meiner Meinung nach ist die bessere Lösung:

  1. Neue rootVC erhalten: let rootVC = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewControllerWithIdentifier("newRootVCIdentifier") as UIViewController
  2. Legen Sie den Rahmen für die neue rootVC aus den Grenzen von UIScreen fest: rootVC.view.frame = UIScreen.mainScreen().bounds
  3. Setzen Sie einen neuen Root-Controller für das aktuelle Fenster (hier mit Animation): UIView.transitionWithView(self.window!, duration: 0.5, options: .TransitionCrossDissolve, animations: { self.window!.rootViewController = rootVC }, completion: nil)

Erledigt!

Sie benötigen die Methode window?.makeKeyAndVisible() nicht, da diese Lösung im aktuellen App-Fenster funktioniert.

3

Es gibt eine 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}

In 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
Rob-4608
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
harsh shah

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
Sachin Rasane