Ich habe eine App mit einem Popover. Wie ich aus dem Popover komme. Ich verlasse das Popover über eine UIAlertController
(Benutzer antwortet Ja). Bevor ich das Popover verwerfe, rufe ich eine Funktion für den Delegaten auf. Innerhalb dieser Funktion ist ein weiterer UIAlertController
. Die zweiten UIAlertController
ist die Anzeige nicht wegen der folgenden Fehler:Fehler mit Popover und UIAlertController
Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior.
dies hier Demo, ich ein schnelles Projekt erstellt, das das Problem zeigt. Es ist nur ein View-Controller mit einer Schaltfläche, die das Popover und eine Schaltfläche auf dem Popover aufruft, die es schließt und eine Delegate-Funktion aufruft, die eine andere UIAlertController
enthält.
Dies ist der Code für den View-Controller, der die popover aufruft:
//Delegate function called from popover
func doSomeStuff() {
let alert = UIAlertController(title: "Some Stuff", message: "Do you want to do some stuff", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Yes", style: .Default, handler: {action in
print("We did something here.")
}))
alert.addAction(UIAlertAction(title: "No", style: .Cancel, handler: nil))
presentViewController(alert, animated: true, completion: nil)
}
@IBAction func callPopover(sender: UIButton) {
let popoverVC = self.storyboard?.instantiateViewControllerWithIdentifier("PopoverView") as! PopoverController
popoverVC.modalPresentationStyle = UIModalPresentationStyle.Popover
popoverVC.preferredContentSize = CGSizeMake(200, 200)
if let popoverController = popoverVC.popoverPresentationController {
popoverController.backgroundColor = UIColor.lightGrayColor()
popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
popoverController.sourceRect = CGRectMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds),0,0)
popoverController.sourceView = callPopoverButton
popoverController.delegate = self
popoverVC.delegate = self
self.presentViewController(popoverVC, animated: true, completion: nil)
}
}
//Allows popover to present on devices besides iPad.
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle{
return UIModalPresentationStyle.None
}
callPopover Die Funktion der Aktion für die Taste auf dem ersten Bildschirm ist.
Dies ist der Code für die popover Bildschirm:
var delegate: ViewController!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func returnToMainView(sender: UIButton) {
let alert = UIAlertController(title: "Dismiss Popover", message: "Do you want to dismiss this popover?", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Yes", style: .Default, handler: {action in
self.delegate.doSomeStuff()
self.dismissViewControllerAnimated(true, completion: nil)
}))
alert.addAction(UIAlertAction(title: "No", style: .Cancel, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
}
Wenn auf dem ersten Bildschirm die popover Taste tippen, die popover richtig angezeigt wird:
die Return-Taste tippen, zeigt das Warnung:
Wenn Sie auf "Ja" klicken, wird die Warnung angezeigt. Die zweite Warnung sollte angezeigt werden, aber an dieser Stelle erhalte ich den Fehler.
Ich denke, dass die zweite Warnung nicht angezeigt wird, weil das Popover nicht beendet wurde, aber keine Ahnung, wie man es umgehen kann.
Klingt wie außergewöhnlich schlecht UX. – Mundi