2017-07-06 7 views
1

J'ai un contrôleur de vue de table avec une cellule qui a un bouton.Déplacer vers un contrôleur de vue en cliquant sur un bouton à l'intérieur de UIPopoverPresentationController

En cliquant sur ce bouton, j'affiche un contrôleur de vue en tant que UIPopoverPresentationController.

Ce contrôleur a deux boutons, YES et NO.

Au clic de OUI je veux être en mesure de segue à un autre contrôleur de vue et sur un clic de NON, je vais rejeter le contrôleur pop over.

Au clic de NO, le popover est rejeté mais au clic de OUI, je ne passe pas au contrôleur de vue requis.

Bien que la méthode load() ait été affichée dans cette vue, le contrôleur a été appelé. Le problème est que le nouveau contrôleur de vue n'est pas affiché.

Le clic de YES, le popover se rejetée, mais reste sur la vue précédente contrôleur

Après mon code

TableViewController classe

func onTapPickButton(sender: UIButton) { 

let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     let popoverViewController = storyboard.instantiateViewController(withIdentifier: "ConfirmDialogViewController") as! ConfirmDialogViewController 
     popoverViewController.preferredContentSize = CGSize(width: view.frame.width/1.33, height: view.frame.height/2.34) 
     popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover 
     let popover: UIPopoverPresentationController = popoverViewController.popoverPresentationController! 
     popover.sourceView = self.view 
     popover.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)   
     popover.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0) 
     popover.delegate = self 

     present(popoverViewController, animated: true, completion: nil) 
} 

PopOver Voir classe contrôleur

@IBAction func onTapNoButton(_ sender: UIButton) { 
     self.dismiss(animated: true, completion: {}) 
    } 

    @IBAction func onTapYesButton(_ sender: UIButton) { 
     let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     let viewController = storyboard.instantiateViewController(withIdentifier: "View") as! ViewController 
present(viewController, animated: true, completion: nil) 

    } 

Toute aide sera appréciée. Je vous remercie.

Répondre

0

Dans OUI action du bouton, rejeter le popOver et dans le bloc d'achèvement présenter le nouveau viewController

@IBAction func onTapYesButton(_ sender: UIButton) { 
       let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
       let viewController = storyboard.instantiateViewController(withIdentifier: "View") as! ViewController 
       self.dismiss(animated: true, completion: { 
         self.present(viewController, animated: true, completion: nil) 
       }) 

      } 
+0

Je reçois l'erreur suivante. Tentative de présenter sur dont la vue ne figure pas dans la hiérarchie des fenêtres! –

0

Vous pouvez créer soit une fermeture (gestionnaire d'achèvement) ou délégué pour attraper lorsque le bouton « OUI » a été sélectionnée. Ceux-ci seraient utiles au cas où vous voudriez capturer des données du Popover ViewController. Par exemple:

gestionnaire d'achèvement:

class ConfirmDialogViewController: UIViewController { 
    open var didSelectYesHandler: ((_ selectedData: String) ->())? 

    public init(for sender: UIView, didSelectYesHandler: ((_ selectedData: String) ->())? = nil) { 
     super.init(nibName: nil, bundle: nil) 

     modalPresentationStyle = .popover 
     self.sender = sender 
     self.didSelectDataHandler = didSelectDataHandler 

     guard let popoverPC = popoverPresentationController else { return } 
     popoverPC.sourceView = sender 
     popoverPC.sourceRect = sender.bounds 
     popoverPC.delegate = self 
    } 

    @IBAction func onTapYesButton(_ sender: UIButton) { 
     dismiss(animated: true, completion: nil) 
     didSelectDataHandler?("YES") 
    } 

    // MARK: - PopoverPC Delegate Methods 

    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { 
     return UIModalPresentationStyle.none 
    } 
} 

Délégué:

protocol ConfirmDialogViewControllerDelegate: class { 
    func didSelectYes(_ selectedDate: String) 
} 

class ConfirmDialogViewController: UIViewController { 
    weak var delegate: ConfirmDialogViewControllerDelegate? 

    @IBAction func onTapYesButton(_ sender: UIButton) { 
     dismiss(animated: true, completion: nil) 
     delegate?.didSelectData("YES") 
    } 
} 

// In your current view controller set 
popoverViewController.delegate = self 

Bonus:

Che ck dehors ce library si vous voulez avoir un popover contenant une liste de données pour la sélection.