ios uistoryboard uipopovercontroller uistoryboardsegue

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).