2017-01-08 3 views
0

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.

enter image description here

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:

enter image description here

die Return-Taste tippen, zeigt das Warnung:

enter image description here

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.

+0

Klingt wie außergewöhnlich schlecht UX. – Mundi

Antwort

0

Ich sehe, dass Sie den zweiten Popup-View-Controller aus dem ersten Popup-View-Controller präsentieren, der entlassen wird. Das verursacht das Problem.

Warum können Sie statt des ersten Popup-View-Controllers den zweiten View-Controller nicht vom Navigationscontroller aus darstellen?

Ändern Sie diese Zeile von presentViewController(alert, animated: true, completion: nil) zu self.navigartionController.presentViewController(alert, animated: true, completion: nil) in Ihrer doSomeStuff() Methode, so dass das erste Popup frei absetzen kann und der Navigationscontroller Ihr zweites Popup anzeigt. Hoffe das hilft!

+0

Ich habe das versucht, und es hat nichts anderes gemacht. Erhalte immer noch den Fehler. Immer noch keine Warnung erhalten. –

+0

Es scheint nicht möglich zu sein, eine Warnung innerhalb einer Warnung auszuführen. Sinnvoll, da Warnsichten nicht modal sind. –

Verwandte Themen