ios - Se desactiva el popover del guión gráfico, los métodos de delegación no se llaman
uistoryboard uipopovercontroller (2)
Tengo un controlador de vista que se presenta en una ventana emergente usando un segmento de guión gráfico.
En el controlador de vista de presentación, tenía el siguiente código:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let svc = segue.destinationViewController as? SettingsViewController {
svc.popoverPresentationController?.delegate = self
}
}
Sin embargo, resulta que el controlador de vista presentado, a pesar de que aparece como una modalPresentationStyle
, tiene un modalPresentationStyle
de modalPresentationStyle
de ''.Modal
y, por lo tanto, un popoverPresentationController
nil
popoverPresentationController
. ¡Extraño!
Entonces, actualicé el código de la siguiente manera:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let svc = segue.destinationViewController as? SettingsViewController {
svc.modalPresentationStyle = .Popover
svc.popoverPresentationController?.delegate = self
}
}
El delegado svc.popoverPresentationController
ahora está configurado como OK, pero si el usuario descartó el popover al tocar afuera, no se UIPopoverPresentationControllerDelegate
ningún UIPopoverPresentationControllerDelegate
delegado UIPopoverPresentationControllerDelegate
(por ejemplo, popoverPresentationControllerShouldDismissPopover
.
Me encontré con el mismo problema y, después de leer la documentación, me di cuenta de que debía llamar:
[self presentViewController:myPopoverViewController animated: YES completion: nil];
para que los métodos delegados sean llamados.
El fragmento completo es el siguiente y se ejecuta dentro del método - (void) prepareForSegue: sender:
// Present the view controller using the popover style.
myPopoverViewController.modalPresentationStyle = UIModalPresentationPopover;
[self presentViewController:myPopoverViewController animated: YES completion: nil];
// Get the popover presentation controller and configure it.
UIPopoverPresentationController *presentationController =
[myPopoverViewController popoverPresentationController];
presentationController.permittedArrowDirections =
UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionRight;
presentationController.sourceView = myView;
presentationController.sourceRect = sourceRect;
https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller
No hay necesidad de delegación en este caso. Si el presentingViewController
(sea cual sea la vc
que contiene la ventana emergente) simplemente anula:
Swift 4
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
print("Dismiss: /(String(describing: self.presentedViewController))")
super.dismiss(animated: flag, completion: completion)
}
Swift 3
override func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?) {
// Before calling super get a handle on which controller is being dismissed
print("Dismiss: /(self.presentedViewController)")
super.dismissViewControllerAnimated(flag, completion: completion)
}
Usted será notificado sin importar cómo se despide. Tampoco es necesario establecer ninguna variable / configuración adicional en el prepareForSegue:
(al menos para manejar esta interacción).