2016-10-30 4 views
0

Ich habe erfolgreich eine 3D-Touch-Verknüpfung aus dem Home-Bildschirm mit diesem Code in dem App Delegaten implementiert:3D-Touch: Presenting Von Aktueller VC

@objc(application:performActionForShortcutItem:completionHandler:) @available(iOS 9.0, *) 
func application (_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler completionHandle: @escaping (Bool) -> Void) { 
    if shortcutItem.type == "com.myAppName.addtask" { 
     let storyBoard = UIStoryboard(name: "Main", bundle: nil) 
     let editorVC = storyBoard.instantiateViewController(withIdentifier: "myVC_ID") as! myVC_Class 
     let rootVC = UIApplication.shared.keyWindow?.rootViewController 
     rootVC?.present(editorVC, animated: false, completion: {() -> Void in 
      completionHandle(true) 
     }) 
    } 
} 

jedoch das Problem, dass es immer von präsentieren erwarten der root viewController. Wenn der Benutzer die App von einem anderen VC verläßt und dann versucht, die Verknüpfung, bekomme ich diesen Fehler:

Warning: Attempt to present xxx on (xxxx.ViewController: 0x7f9acc83e000) whose view is not in the window hierarchy!

Wenn der Benutzer in der App war und die letzte Ansicht war die Wurzel VC, die Verknüpfung aus dem Home-Bildschirm funktioniert super. Wie kann ich es so machen, dass es funktioniert, unabhängig davon, was VC zuletzt verwendet wurde?

Antwort

1

Das Prinzip dessen, was Sie tun, ist absolut richtig. Warum funktioniert es nicht?

Was ich tun würde, ist der Root-View-Controller des Fensters ein Container-View-Controller, nie wird verschoben - die ganze Aktion passiert in ihm. Auf diese Weise ist der Root-View-Controller des Fensters nicht in der Fensterhierarchie enthalten, da er über einen präsentierten View-Controller verfügt. Und Sie könnten das leicht herausfinden, indem Sie herausfinden, ob es einen präsentierten View-Controller hat und, wenn ja, von , dass.

+0

Vielen Dank für die schnelle Antwort. Ich denke, das ist meine Frage, ich weiß, das Szenario ist, dass der Root-View-Controller VC2 präsentiert, dann verlässt der Benutzer, versucht, 3D-Touch-Verknüpfung zurück, und ich bekomme diese Fehlermeldung. Also, wie ändere ich meinen Code, um von der anderen VC OR zu präsentieren, und das ist noch besser, gehen Sie zurück zu/rufen Sie ein Abwickeln-Segment zurück zum Wurzel-VC und präsentieren Sie dann davon. –

+0

Uh, fragen Sie nach seinem 'presentedViewController'? Ist das eine Trickfrage? – matt

+0

Vergiss diesen letzten Kommentar, ich habe ihn einfach gelöscht. Es funktioniert jetzt. Vielen Dank. –