2016-06-29 15 views
0

Ich habe eine UIAlertController, in der die Optionen von einem Array aufgefüllt werden und dem Benutzer präsentiert werden. Der Benutzer wählt dann eine Option aus der Warnung aus. Danach habe ich eine separate Warnung, die dem Benutzer eine Bestätigungsmeldung mit einer OK-Schaltfläche zur Verfügung stellt.Versuch, 2 UIAlertControllers zurück zu präsentieren

Der obige Code sammelt die Daten aus dem Array und verschiebt sie in Aktionen in myAlert. Der obige Code befindet sich innerhalb einer for-Schleife.

Danach benutze ich eine Funktion, um den obersten View-Controller abzurufen, und dann den nächsten Alarm zu drücken.

let top = topMostController() 
let alertController = UIAlertController(title: "Location pinned", message: "You've successfully pinned this location, good work!", preferredStyle: UIAlertControllerStyle.Alert) 
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default) { 
    (result : UIAlertAction) -> Void in 
    print("OK") 
} 
alertController.addAction(okAction) 

self.presentViewController(myAlert, animated: true, completion: nil) 
top.presentViewController(alertController, animated: true, completion: { 
    _ in 
}) 

Der Fehler, den ich erhalten ist:

Der Versuch, die Ansicht eines View-Controller zu laden, während es Aufheben der Zuordnung und nicht erlaubt ist und in undefiniertem Verhalten führen kann. UIAlertController: 0x1535b1cd0.

Kann mir jemand dabei helfen?

+1

Warum rufen Sie 'self.presentViewController (myAlert, animiert: true, completion: nil)' im zweiten Codeblock auf? Haben Sie nicht schon im ersten Codeblock die erste Warnung angezeigt? Können Sie auch den Abschlussblock der ersten Warnung verwenden, um die zweite anzuzeigen (bedingt aufgrund einer Benutzeraktion)? – wottle

+0

Sie können die Präsentation Ihrer Bestätigung AlertController im Aktionshandler für den ursprünglichen AlertController aufrufen. Es besteht keine Notwendigkeit, es auf dem obersten Controller auszuführen. Führen Sie es einfach auf sich selbst aus, wie Sie es für das Original getan haben. Darüber hinaus haben Sie einen Retain-Zyklus in Ihrer Aktion Schließung. Sie müssen das Selbst als [unowned self] oder [weak self] erfassen, um das implizite starke Zurückhalten in einer Schließung zu verhindern. – SArnab

+0

Nun, ich habe Self.presentViewController für myAlert bewegt, aber das hat keinen Einfluss darauf. SArnab, könntest du noch ein wenig mehr ausarbeiten? – vkrishnan23

Antwort

2

Ich denke, das ist, was Sie suchen. Der zweite muss mit der Entlassungsaktion des ersten aufgerufen werden. Auch wenn Sie mit UI arbeiten, ist es sicherer, wenn Sie nicht sicher sind, dass Sie sich gerade in der Hauptwarteschlange befinden.

let firstAlertController = UIAlertController(title: "First", message: "This is the first message.", preferredStyle: UIAlertControllerStyle.Alert) 

let secondAlertController = UIAlertController(title: "Second", message: "This is the second message.", preferredStyle: UIAlertControllerStyle.Alert) 
let secondDismissAction = UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default, completion: nil) 
secondAlertController.addAction(secondDismissAction) 

let firstDismissAction = UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default) { 
    UIAlertAction in 
    dispatch_async(dispatch_get_main_queue()) { 
     self.presentViewController(secondAlertController, animated: true, handler: nil) 
    } 
} 

firstAlertController.addAction(firstDismissAction) 
self.presentViewController(firstAlertController, animated: true, completion: nil) 
+0

Sethmr, ich habe dispatch_async zum Füllen der Alarmaktionen für myAlert verwendet, während ich diese aus einem Array schiebe. Aber ich bin verloren auf, was Sie meinen, indem Sie das dispatch_async für beide alarmcontrollers verwenden – vkrishnan23

+0

Ich prüfte gerade die Funktion, die ich schrieb. Wenn Sie nur den Text in meinem durch den Text in Ihrem ersetzen, wird es ausgeführt. Sie würden nur dispatch_async für die presentingViewController-Zeile und nur für diejenigen verwenden, die Sie möglicherweise nicht in der Hauptwarteschlange sind. Für meine Zwecke habe ich meine Funktion in viewDidLoad platziert, die in der Hauptwarteschlange ausgeführt wird, es sei denn, Sie rufen eine Async-Funktion mit einem Beendigungshandler-Abschluss auf, sodass ich sie nur in der firstDismissAction platziert habe. – Sethmr

+0

Der zweite alertController muss wie in der Kündigungsaktion des ersten Alert-Controllers aufgerufen werden. – Sethmr