swift - Warning: Attempt to Present ViewController on whose ViewController isn't in the view hierarchy (3D Touch) -


basically, trying implement home screen quick actions app. when tap on 1 of quick actions error:

warning: attempt present theviewcontroller on viewcontroller view not in window hierarchy!

i have looked @ other stack on flow posts had same issue, solutions didn't work me. also, in applicationdidenterbackground method added self.window?.rootviewcontroller?.dismissviewcontrolleranimated(true, completion: nil).

here of relevant 3d touch methods have included in app delegate:

func application(application: uiapplication, performactionforshortcutitem shortcutitem: uiapplicationshortcutitem, completionhandler: (bool) -> void) {     let handledshortcutitem = self.handleshortuctitem(shortcutitem)     completionhandler(handledshortcutitem) } 

also, have these helper methods:

    enum shortcutidentifier: string {     case first     case second      init?(fulltype: string) {         guard let last = fulltype.componentsseparatedbystring(".").last else { return nil }         self.init(rawvalue: last)     }     var type: string {         return nsbundle.mainbundle().bundleidentifier! + ".\(self.rawvalue)"     } }  func handleshortuctitem(shortcutitem: uiapplicationshortcutitem) -> bool {     var handled = false      guard shortcutidentifier(fulltype: shortcutitem.type) != nil else { return false }     guard let shortcuttype = shortcutitem.type string? else { return false }      switch(shortcuttype) {     case shortcutidentifier.first.type:         handled = true         let navvc = mainstoryboard.instantiateviewcontrollerwithidentifier("firstviewcontroller") as! firstviewcontroller         self.window?.rootviewcontroller?.presentviewcontroller(navvc, animated: true, completion: nil)         break     case shortcutidentifier.second.type:         handled = true         let navvc = mainstoryboard.instantiateviewcontrollerwithidentifier("secondviewcontroller") as! secondviewcontroller         self.window?.rootviewcontroller?.presentviewcontroller(navvc, animated: true, completion: nil)         break     default:         break     }       return handled } 

a sort of mindless solution wrap delay around presentviewcontroller calls (delay defined here: dispatch_after - gcd in swift?):

switch(shortcuttype) { case shortcutidentifier.first.type:     handled = true     let navvc = mainstoryboard.instantiateviewcontrollerwithidentifier("firstviewcontroller") as! firstviewcontroller     delay(0.3) {         self.window?.rootviewcontroller?.presentviewcontroller(navvc, animated: true, completion: nil)     }     break case shortcutidentifier.second.type:     handled = true     let navvc = mainstoryboard.instantiateviewcontrollerwithidentifier("secondviewcontroller") as! secondviewcontroller     delay(0.3) {         self.window?.rootviewcontroller?.presentviewcontroller(navvc, animated: true, completion: nil)     }     break default:     break } 

the idea give interface time finish appearing before trying presentation.


Comments

Popular posts from this blog

c++ - llvm function pass ReplaceInstWithInst malloc -

Cross-Compiling Linux Kernel for Raspberry Pi - ${CCPREFIX}gcc -v does not work -

java.lang.NoClassDefFoundError When Creating New Android Project -