open instantiate how from change ios swift uiviewcontroller appdelegate

ios - instantiate - Abrir el controlador de vista del delegado de la aplicación usando swift



open viewcontroller swift 4 (10)

Estoy tratando de crear una notificación de inserción que determina qué vista abrir según la información obtenida de la inserción.

Me las arreglé para obtener la información del empuje, pero ahora estoy luchando para que la vista se abra

Mirando otras preguntas de desbordamiento de pila, actualmente tengo lo siguiente:

El delegado de la aplicación terminó de cargar:

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

Actualmente esto falla en la línea var ViewController = self ...


Hay una versión rápida 4

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}


Debe establecer la propiedad ViewController StoryBoardId como se muestra a continuación.

abra viewController usando la codificación como se muestra a continuación en 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 }


Primero inicialice la window

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

Para configurar rootViewController dentro de AppDelegate Class

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


Swift 3

Para presentar la vista junto con el controlador de navegación:

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


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()


Swift 3:

Este es mi enfoque preferido cuando presento un nuevo viewController desde el viewController actual a través del AppDelegate. De esta manera, no tiene que derribar completamente su jerarquía de vistas al manejar una notificación push o un enlace universal

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


Yo diría que crear UIWindow cada vez que quiera cambiar rootViewController es una mala idea. Después de un par de cambios de rootVC (usando la solución superior), tendrá muchas UIWindows en su aplicación a la vez.

En mi opinión, la mejor solución es:

  1. Obtenga un nuevo rootVC: let rootVC = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewControllerWithIdentifier("newRootVCIdentifier") as UIViewController
  2. Establezca el marco para el nuevo rootVC desde los límites de rootVC.view.frame = UIScreen.mainScreen().bounds : rootVC.view.frame = UIScreen.mainScreen().bounds
  3. Establezca un nuevo controlador raíz para la ventana actual (aquí con animación): UIView.transitionWithView(self.window!, duration: 0.5, options: .TransitionCrossDissolve, animations: { self.window!.rootViewController = rootVC }, completion: nil)

¡Hecho!

¿No necesita la window?.makeKeyAndVisible() método window?.makeKeyAndVisible() , porque esta solución funciona en la ventana de la aplicación actual.


En Swift 3

let mainStoryboard : UIStoryboard = UIStoryboard(name: StorybordName, bundle: nil) let initialViewControlleripad : UIViewController = mainStoryboard.instantiateViewController(withIdentifier: identifierName) as UIViewController if let navigationController = self.window?.rootViewController as? UINavigationController { navigationController.pushViewController(initialViewControlleripad, animated: animation) } else { print("Navigation Controller not Found") }


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)


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)