[Résolu] Dismiss popOver

busterTheobusterTheo Membre
août 2015 modifié dans API UIKit #1

Bonjour,


il s'agit d'un problème de dismiss d'un popOver.


 


J'ai besoin de dismiss le popOver quand j'ouvre la nav de gauche.


 


Une petite vidéo sera plus explicite.


 


ça fonctionne dans le premier cas et pas dans le second.


 


Dans le premier cas, je suis dans le controller qui est le root :



pagesNavigationController = UINavigationController(rootViewController: etape0ViewController)

puis ensuite, après le swipe de right to left,  je rentre dans un pageView, et là  ça marche pas


 


J'ouvre la nav à  partir du container général :



func toggleNavPatients() {

let slideNavPasEncoreOuverte = (etatCourantSlideNav == .SlideNavFermee)

if slideNavPasEncoreOuverte {

if (patientsViewController == nil) {
patientsViewController = UIStoryboard.patientsViewController()
patientsViewController?.delegatePatients = self
} else {
}

self.view.insertSubview(patientsViewController!.view, atIndex: 0)
addChildViewController(patientsViewController!)
patientsViewController?.didMoveToParentViewController(self)

etatCourantSlideNav = .SlideNavOuverte

animateNavCenterPanelXPosition(targetPosition: CGRectGetWidth(pagesNavigationController.view.frame) - pageDecalage)
} else {
animateNavCenterPanelXPosition(targetPosition: 0) { finished in
self.etatCourantSlideNav = .SlideNavFermee
self.patientsViewController = nil
}
}
}

J'y parviens tout simplement en rajoutant cela dans "toggleNavPatients" :



self.dismissViewControllerAnimated(true, completion: nil)

J'y parviens également en rajoutant cela dans "toggleNavPatients" :



func toggleNavPatients()

dispatch_async(dispatch_get_main_queue(),{
self.dismissViewControllerAnimated(true, completion: nil)
})

....
}

Ensuite j'ai essayé ça pour l'écran suivant :



dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
self.dismissViewControllerAnimated(true, completion: nil)

dispatch_async(dispatch_get_main_queue()) {
self.dismissViewControllerAnimated(true, completion: nil)
}
}


ça marche pas.


 


Ou ça, à  partir de ce lien :



func dispatch_to_main_queue(block: dispatch_block_t?) {
dispatch_async(dispatch_get_main_queue(), block!)
}

func dispatch_to_background_queue(block: dispatch_block_t?) {
let q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(q, block!)
}

Puis toujours dans"toggleNavPatients" :



dispatch_to_main_queue {
self.dismissViewControllerAnimated(true, completion: nil)
}

dispatch_to_background_queue {
self.dismissViewControllerAnimated(true, completion: nil)
}

C'est la première fois que je joue avec ces trucs. C'est peut-être pas la bonne piste.


 


 


Quelqu'un aurait une idée ?


 


Merci.


Réponses

  • Désolé, j'ai résolu mon problème autrement.


     


    C'était tout simple :



    if listeDesVariables.localController == "Etape0ViewController" {
    self.dismissViewControllerAnimated(true, completion: nil)
    } else {
    if listeDesVariables.localControllerVC != nil {
    listeDesVariables.localControllerVC.dismissViewControllerAnimated(true, completion: nil)
    }
    }

    Comme ça je ne touche as à  ce truc de dispatch, car de toutes les façons, je n'y comprend rien.


     


    Je ne sais même pas ce que c'est que les threads... Enfin, pas trop...


     


     


    Merci quand même


  • CéroceCéroce Membre, Modérateur

    Je ne sais même pas ce que c'est que les threads... Enfin, pas trop...

    Tu devrais te renseigner...

    Tout ce qui est IHM doit être fait sur le thread principal en Cocoa.
    C'est pour cela qu'on voit souvent dispatch_async(dispatch_get_main_queue(),...) qui dit de faire le traitement sur le thread principal. C'est à  appeler quand tu travailles sur un autre thread (par ex. bloc de réponse à  une requête réseau).

  •  


     


    Tu devrais te renseigner...

     


    Oui, j'ai déjà  vu des trucs là -dessus, en fait.


     


    Par contre, ça, ça me clariefie bien les choses.



     


     


    C'est à  appeler quand tu travailles sur un autre thread (par ex. bloc de réponse à  une requête réseau).

     


    Merci.


     


    Mais apparemment, pour l'instant, je n'en ai pas besoin. Enfin, j'espère.


     


    Dans mon projet, on se balade d'écran en écran, puis on manipule des poignées et des lignes, ou on rempli des champs, puis on stock tout ça dans coredata.


     


    Tout ça pour chaque cell d'un tableView (en slideNav).


     


    Si tu veux voir une démo, c'est ici.


Connectez-vous ou Inscrivez-vous pour répondre.