Ich versuche, eine Push-Benachrichtigung zu erstellen, die anhand der aus dem Push erhaltenen Informationen festlegt, welche Ansicht geöffnet werden soll.
Ich habe es geschafft, die Informationen aus dem Push zu erhalten, aber ich habe jetzt Probleme, die Ansicht zu öffnen
Bei anderen Fragen zum Stapelüberlauf habe ich derzeit Folgendes:
App-Delegierter 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.
ios
swift
uiviewcontroller
appdelegate
Lister
quelle
quelle
Antworten:
Sie müssen die ViewController StoryBoardId-Eigenschaft wie im folgenden Bild festlegen.
Öffnen Sie den viewController mit der folgenden Codierung in Kürze
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 }
Für iOS 13+ (basierend auf einem Artikel von dev2qa )
Öffnen
SceneDelegate.swift
und fügen Sie Folgendes hinzufunc scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // If this scene's self.window is nil then set a new UIWindow object to it. self.window = self.window ?? UIWindow() // Set this scene's window's background color. self.window!.backgroundColor = UIColor.red // Create a ViewController object and set it as the scene's window's root view controller. self.window!.rootViewController = ViewController() // Make this scene's window be visible. self.window!.makeKeyAndVisible() guard scene is UIWindowScene else { return } }
Es gibt ein Open-Source- Navigationsprogramm, das versucht, dies zu vereinfachen. Beispiel
quelle
SceneDelegate.scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
ein (FYI, ich habe ein Navigationsprogramm basierend darauf erstellt )Swift 3:
Dies ist mein bevorzugter Ansatz, wenn ich einen neuen viewController vom aktuellen viewController über das AppDelegate präsentiere. Auf diese Weise müssen Sie Ihre Ansichtshierarchie beim Behandeln einer Push-Benachrichtigung oder eines universellen Links nicht vollständig auflösen
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) } }
quelle
applicationWillEnterForeground
Methode meines appDelegate eingefügt, um einen Neustart meiner App auf dem Begrüßungsbildschirm beim erneuten Öffnen zu erzwingen (auf diese Weise kann ich meine Daten und die Benutzeroberfläche ordnungsgemäß aktualisieren, indem ich ein einfaches "All-through-One-Path" -Modell pflege lol :) Danke!Swift 3
So präsentieren Sie die Ansicht zusammen mit dem Navigationscontroller:
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) }
quelle
Initialisieren Sie zuerst die
window
self.window = UIWindow(frame: UIScreen.mainScreen().bounds) let storyBoard = UIStoryboard(name: "Main", bundle: nil)
Zum Einstellen
rootViewController
innerhalb derAppDelegate
Klasselet viewController = storyBoard.instantiateViewControllerWithIdentifier("Circles") as UIViewController self.window?.rootViewController = viewController self.window?.makeKeyAndVisible()
quelle
Es gibt eine schnelle 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}
quelle
In 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") }
quelle
Ich würde sagen, dass es eine schlechte Idee ist, UIWindow jedes Mal zu erstellen, wenn Sie rootViewController ändern möchten. Nach einigen Änderungen an rootVC (unter Verwendung der oberen Lösung) haben Sie viele UIWindows gleichzeitig in Ihrer App.
Meiner Meinung nach ist eine bessere Lösung:
let rootVC = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewControllerWithIdentifier("newRootVCIdentifier") as UIViewController
rootVC.view.frame = UIScreen.mainScreen().bounds
UIView.transitionWithView(self.window!, duration: 0.5, options: .TransitionCrossDissolve, animations: { self.window!.rootViewController = rootVC }, completion: nil)
Erledigt!
Sie benötigen keine Methode
window?.makeKeyAndVisible()
, da diese Lösung im aktuellen App-Fenster funktioniert.quelle
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()
quelle
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)
quelle
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)
quelle