Ich habe eine Tabellenansicht, in der beim Laden möglicherweise jede Zelle einen NSError zurückgibt, den ich in einem UIAlertController angezeigt habe. Problem ist, dass ich diesen Fehler in der Konsole erhalte, wenn mehrere Fehler zurückgegeben werden.
Warnung: Versuch, UIAlertController: 0x14e64cb00 in MessagesMasterVC: 0x14e53d800 zu präsentieren, das bereits präsentiert wird (null)
Im Idealfall möchte ich dies in meiner UIAlertController-Erweiterungsmethode behandeln.
class func simpleAlertWithMessage(message: String!) -> UIAlertController {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
let cancel = UIAlertAction(title: "Ok", style: .Cancel, handler: nil)
alertController.addAction(cancel)
return alertController
}
Basierend auf der Antwort von matt habe ich die Erweiterung in eine UIViewController-Erweiterung geändert, die viel sauberer ist und viel presentViewController-Code speichert.
func showSimpleAlertWithMessage(message: String!) {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
let cancel = UIAlertAction(title: "Ok", style: .Cancel, handler: nil)
alertController.addAction(cancel)
if self.presentedViewController == nil {
self.presentViewController(alertController, animated: true, completion: nil)
}
}
ios
uialertcontroller
versteckter Benutzername
quelle
quelle
Antworten:
Es ist nicht der UIAlertController, der "bereits präsentiert", sondern MessagesMasterVC. Ein Ansichtscontroller kann jeweils nur einen anderen Ansichtscontroller präsentieren. Daher die Fehlermeldung.
Mit anderen Worten, wenn Sie einem Ansichts-Controller angewiesen haben
presentViewController:...
, dies nicht erneut zu tun, bis der dargestellte Ansichts-Controller entlassen wurde.Sie können den MessagesMasterVC fragen, ob er bereits einen Ansichts-Controller präsentiert, indem Sie dessen untersuchen
presentedViewController
. Wenn nichtnil
, sagen Sie es nichtpresentViewController:...
- es wird bereits ein View Controller angezeigt.quelle
quelle
UIAlertController
Brand in kurzer Folge zu präsentieren. Überprüfen Sie dies, wenn Sie ein ähnliches Problem haben.Nun, die oben vorgeschlagenen Lösungen haben aus meiner Sicht ein wesentliches Problem:
Wenn Sie Ihren ViewController fragen, ob das Attribut 'presentViewController' gleich Null ist und die Antwort falsch ist, können Sie nicht zu dem Schluss kommen, dass Ihr UIAlertController bereits vorhanden ist. Es kann sich um einen beliebigen präsentierten ViewController handeln, z. B. einen PopOver. Mein Vorschlag, sicher zu überprüfen, ob der Alert bereits auf dem Bildschirm angezeigt wird, lautet also wie folgt (den präsentierten ViewController als UIAlertController umwandeln):
}}
quelle
Hier ist eine Lösung, die ich in Swift 3 verwende. Diese Funktion zeigt dem Benutzer eine Warnung an. Wenn Sie sie mehrmals aufrufen, bevor der Benutzer die Warnung verworfen hat, wird der neue Warntext zu der bereits angezeigten Warnung hinzugefügt . Wenn eine andere Ansicht angezeigt wird, wird die Warnung nicht angezeigt. Nicht alle werden diesem Verhalten zustimmen, aber es funktioniert gut für einfache Situationen.
quelle
Wir können einfach überprüfen, ob ein View Controller vorhanden ist.
Wenn angezeigt, überprüfen Sie, ob es sich um eine Art UIAlertController handelt.
quelle
Sie können in einer einzigen Zeile testen, ob bereits eine Warnung angezeigt wird:
quelle
Diese Kategorie kann alle modalen Controller von UIAlertController automatisch verwalten.
UIViewController + JCPresentQueue.h
quelle
Ich habe das verwendet, um zu erkennen, zu entfernen und zu alarmieren.
Zuerst erstellen wir eine Warnung mit der folgenden Funktion.
Und in einem anderen Teil Ihres Codes
quelle
Für die neueste Swift-Sprache können Sie Folgendes verwenden:
quelle
Schließen Sie den aktuellen Controller und präsentieren Sie den Alarm-Controller wie folgt
quelle
Für diejenigen, die nicht wissen, wie sie die meisten Viewcontroller bekommen
Für diejenigen, die nicht wissen, wie sie die meisten Viewcontroller bekommen
quelle
Ich musste eine Warteschlange erstellen, um die UIAlertController-Anforderungen zu stapeln.
quelle
Schließen Sie einfach den aktuellen Controller und präsentieren Sie den gewünschten, dh
self.dismiss(animated: false, completion: nil)
self.displayAlertController()
quelle