web-dev-qa-db-fra.com

Rejeter Popover après le toucher

J'ai créé un popover dans ma MainViewController quand un bouton est touché à l'aide de la UIPopoverPresentationController et réglé comme son délégué comme il est montré dans la WWDC 2014, de la manière suivante:

MainViewController.Swift  

class MainViewController : UIViewController, UIPopoverPresentationControllerDelegate {

   @IBAction func showPopover(sender: AnyObject) {

      var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("PopOverViewController") as UIViewController

      popoverContent.modalPresentationStyle = UIModalPresentationStyle.Popover
      var popover = popoverContent.popoverPresentationController

      popoverContent.preferredContentSize = CGSizeMake(250, 419)
      popover!.delegate = self
      popover!.sourceView = self.view
      popover!.sourceRect = CGRectMake(180,85,0,0)

      self.presentViewController(popoverContent, animated: true, completion: nil)        
   }  
}

Le popover contient une vue. Lorsque la vue est cliquée avec une reconnaissance de geste, je montre LastViewController en utilisant une séquence modale, la séquence modale est créée via Interface Builder, et non dans le code en utilisant une action pour présenter l'autre LastViewController.

Une fois que la LastViewController est renvoyée et que je suis de retour dans la MainViewController, la fenêtre popover reste ouverte.

Dans le PopOverController Je n'ai que le code par défaut, rien de plus.

LastViewController.Swift  

@IBAction func dismissVIew(sender: AnyObject) {        
    self.dismissViewControllerAnimated(true, completion: nil)
}

Le code ci-dessus est utilisé pour ignorer la LastViewController une fois que le bouton à l'intérieur est touché. 

Storyboard

enter image description here

Comment puis-je rejeter le popover une fois que l'autre LastViewController est visible ou avant que l'autre LastViewController soit ouvert?

Merci d'avance

7
Victor Sigler

J'ai déjà répondu au même problème sur ici.
Le scénario est différent mais la solution est la même

Vous devez écrire du code pour ignorer le contrôleur de vue présenté à la fin du contrôleur de vue actuel. 
Inscrivez ci-dessous le code correspondant à votre méthode de renvoi de LastViewController.Swift

 var tmpController :UIViewController! = self.presentingViewController;

        self.dismissViewControllerAnimated(false, completion: {()->Void in
            println("done");
            tmpController.dismissViewControllerAnimated(false, completion: nil);
        });


Télécharger lien

18
Jageen

Dans votre action sur le bouton FinalViewController, avez-vous essayé:

@IBAction func dismissMe() {
//this should tell the popover to tell the main view controller to dismiss it.
    self.presentingViewController!.presentingViewController!.dismissViewControllerAnimated(false, completion: nil)
}
6
Jeremy Pope

voici comment je le ferais.

J'utilise généralement l'initialisation différée pour PopoverViewController et son ContentViewController

lazy var popoverVC: UIPopoverController = {
    let vc = UIPopoverController(contentViewController: self.contentVC)

    vc.delegate = self

    return vc
}()


lazy var contentVC: UIViewController = {
    let vc = self.storyboard?.instantiateViewControllerWithIdentifier("ContentViewController") as UIViewController

    vc.modalInPopover = true

    return vc
}()

dans mon contentViewController, je tiens une référence à UIPopoverController.

var popoverVC: UIPopoverController!

puis quand je montre le popover je viens d'attribuer le popoverController au contentViewController

@IBAction func showPopover(sender: UIButton) {
    contentVC.popoverVC = self.popoverVC

    let viewCenterRect = self.view.convertRect(self.view.bounds, toView: self.view)

    popoverVC.presentPopoverFromRect(CGRectMake(CGRectGetMidX(viewCenterRect), CGRectGetMidY(viewCenterRect), 1, 1), inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.allZeros, animated: true)
}

enfin je rejette le Popover par programmation à l'intérieur d'un @IBAction

@IBAction func dismissPopover(sender: AnyObject) {
    popoverVC.dismissPopoverAnimated(true)
}
1
ergoon

Le popover contient une vue et lorsque la vue est cliquée avec un outil de reconnaissance de gestes tactiles, je montre un autre ViewController utilisant une séquence modale.

Autant que je sache, vous devriez pouvoir appeler dismissViewControllerAnimated(_:completion:) à partir de l’action associée à votre dispositif de reconnaissance des gestes du toucher. Ceci rejettera le popover que vous avez présenté en appel:

self.presentViewController(popoverContent, animated: true, completion: nil)        

Vous pouvez appeler cette méthode sur le contrôleur de vue popover lui-même, selon ce qui vous convient le mieux:

Le contrôleur de vue présentateur est responsable de la suppression du contrôleur de vue qu'il a présenté. Si vous appelez cette méthode sur le contrôleur de vue présenté, elle transmet automatiquement le message au contrôleur de vue.

0
sergio