Gleichzeitige UIAlertControllers
Ich bin Portierung meiner app auf iOS 8.0 und beachten Sie, dass uialertview-Objekt ist veraltet.
So, ich habe mich verändert, die Dinge zu verwenden, ein UIAlertController. Das funktioniert in den meisten Fällen.
Außer, wenn meine app öffnet, ist es mehrere Prüfungen zu berichten verschiedenen Staaten zurück an den Benutzer...
E. g... "Achtung, Sie haben nicht X-up und tun müssen, um Y vor Abschluss der Projekte" und "Warnung, Sie verwenden eine beta-version und verlassen Sie sich nicht auf die Ergebnisse", etc...(dies sind nur Beispiele!!!)
Unter der uialertview-Objekt, ich würde (sagen) zwei alert-Boxen, die gleichzeitig die der Benutzer Tippen Sie zweimal, um zu schließen die beiden...aber Sie haben beide angezeigt.
Unter UIAlertController mit dem code unten eine "Allgemeine" Meldung, erhalte ich nur eine alert-Nachricht zusammen mit einer Konsole-Nachricht:
Warnung: Versuch UIAlertController: 0x13f667bb0 auf TestViewController: 0x13f63cb40, die bereits präsentiert UIAlertController: 0x13f54edf0
So, obwohl die oben wahrscheinlich kein gutes Beispiel, ich denke es kann Zeiten geben, wenn mehr als eine Globale Warnung " kann präsentiert werden müssen, aufgrund von 'Ereignissen' während der Bedienung einer app. Unter dem alten uialertview-Objekt, Sie erscheinen würden, aber es scheint, dass Sie nicht unter einem UIAlertController.
Kann jeder jeden schlagen, wie dies erreicht werden könnte, mit einem UIAlertController?
Dank
+(void)presentAlert:(NSString*)alertMessage withTitle:(NSString*)title
{
UIAlertController *alertView = [UIAlertController
alertControllerWithTitle:title
message:alertMessage
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* ok = [UIAlertAction
actionWithTitle:kOkButtonTitle
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action)
{
//Do some thing here
[alertView dismissViewControllerAnimated:YES completion:nil];
}];
[alertView addAction:ok];
UIViewController *rootViewController = [[[UIApplication sharedApplication] delegate] window].rootViewController;
[rootViewController presentViewController:alertView animated:YES completion:nil];
Edit: ich Bemerke, dass auf iOS8, die Präsentation von zwei AlertViews nacheinander, Sie sind 'in der Warteschlange' und erscheinen nacheinander in der Erwägung, dass in iOS7, Sie erscheinen gleichzeitig. Es scheint, Apple geändert haben uialertview-Objekt zur queue für mehrere Instanzen. Gibt es eine Möglichkeit, dies zu tun mit UIAlertController, ohne weiter zu verwenden (veraltet, aber modifiziert) uialertview-Objekt???
- haben Sie noch Glück bei der Suche nach einer Antwort auf Ihre Frage?
- Leider Nein. In dem moment, Im kleben mit der scheinbar geänderten uialertview-Objekt. Zeitmangel verbietet mir, genauer zu untersuchen.
- Haben wir keine Lösung für dieses Problem?
- Ich habe gerade gebucht und meine Lösung, überprüfen Sie es heraus unten.
- UIAlertController ist mehr und mehr suchen, wie ein weniger als die Hälfte-a$$ed-job für mich.
- Überprüfen Sie meine Antwort unten (stackoverflow.com/a/38875376/3412051). Ich löste dieses Problem und erstellt ein Github-Projekt für andere.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin auch vor einigen problemls mit UIAlertController, wenn es darum geht, Sie zu präsentieren.
Jetzt die einzige Lösung, die ich vorschlagen kann, ist den vorliegenden Alarm-controller von oben die meisten presentedViewContrller, wenn eine oder Fenster rootViewController.
Die Warnung, die Sie erhalten, nicht nur beschränkt auf UIAlertController. Ein view-controller(Fenster rootViewController in deinem Fall) kann nur einen view controller gleichzeitig.
Ich verstehe das Problem hier und kam mit der folgenden Lösung über eine Kategorie von UIAlertController. Es ist so konzipiert, dass wenn eine Warnung ist bereits vorgestellt worden, es verzögert zeigen den nächsten Alarm, bis er eine Benachrichtigung erhält, dass der erste abgewiesen wurde.
UIAlertController+MH.h
UIAlertController+MH.m
Dieser code auch behandelt den Fall, wo eine Vorherige Warnung wurde vorgestellt, über die veralteten uialertview-Objekt, d.h. es wartet auf Sie bis zum Ende zu.
Testen dieses heraus alle Sie tun müssen ist, rufen Karte zweimal in Folge mit zwei verschiedenen Alarm-Controller und du wirst sehen, die zweite wartet, bis die erste wurde entlassen, bevor Sie vorgestellt werden.
-(void)showUialertController:(UIAlertController*)alert;
oder ähnliches, die unter der Haube trägt, aus der Schlange. Nicht sicher, ob wir würden uns darum kümmern müssen UIAlertViews dann.NSNotificationCenter
block alertView() muss ersetzt werden durch[self mh_show]
zu behandeln, der Fall bei mehr als 2 gleichzeitigen windows (windowLevel muss nochmals überprüft werden, vor der Präsentation). Sonst verschoben Alarm Controller gleichzeitig präsentiert werden nach Erhalt UIWindowDidBecomeHiddenNotification.mh_show
. Wenn Sie das tun, werden Sie sehen, first alert, als zwei sich überschneidende Meldungen mit dunkler hintergrund. Wird mein Problem beheben Sie alle einer nach dem anderen.Diese Lösung ist für mich arbeiten. Ich habe eine AlertManager, dass ist der Umgang mit einer Warteschlange von Warnungen, die Anwesenden einer nach dem anderen. Zu wissen, Wann eine andere Warnung, ich bin Verlängerung UIAlertController und überschreiben seine viewDidDisappear Funktion.
Diese Lösung muss verwendet werden, nachdem viewDidAppear. Wenn nicht, wird die Warnung nicht vorgelegt werden. Die Kette wäre gebrochen und es werden keine weiteren Warnungen vorgelegt werden würden. Eine andere Möglichkeit wäre, zu versuchen, eine hängende Alarm höher oder verwerfen es, die befreien würde, bis die Warteschlange für die zukünftige Alarme.
Ich war nicht glücklich mit einer der Lösungen hier, wie Sie benötigt zu viel manuelle Arbeit benötigt oder swizzling, die mir nicht gut in einer Produktions-App. Ich habe eine neue Klasse ( GitHub ), die Elemente aus anderen Antworten hier.
AlertQueue.h
AlertQueue.m
Beispiel für die Verwendung
Dies kann gelöst werden, indem ein check-flag in UIAlertcontroller action-handler.
Habe ich eine Github-Projekt MAAlertPresenter mit einer demo zu behandeln dieses Problem. Sie können es verwenden, zu präsentieren UIAlertController eins nach dem anderen mit nur wenigen Zeilen ändert.
Scheint es zu sein, alte Frage, aber immer noch posten wie Es sein könnte nützlich für jemanden, der für dies, obwohl Apple nicht empfehlen, mehrere Warnungen stapeln, das ist, warum Sie veraltet diese uialertview-Objekt aus, um UIAlertController Umsetzung.
Habe ich eine AQAlertAction Unterklasse für UIAlertAction. Sie können es verwenden, für atemberaubende Warnungen, die Verwendung ist dieselbe, wie Sie mit Hilfe UIAlertAction. Alles, was Sie tun müssen, ist importieren AQMutiAlertFramework in Ihrem Projekt oder Sie können die Klasse auch (siehe Beispiel-Projekt für die). Intern verwendet binäre semaphore für eine Staffelung der Warnungen, bis Benutzer-handle zugeordnete Aktion aktuelle Warnmeldung angezeigt. Lassen Sie mich wissen, wenn es für Sie arbeitet.
Ich auch vor dem gleichen Problem nach der Umstellung von uialertview-Objekt zu UIAlertController. Ich weiß nicht, wie Apple-Politik, weil "Message-Boxen" schon immer stapelbar in fast jeder SO aus dem URKNALL.
Ich bin damit einverstanden, dass der Auger-Benachrichtigungen ist eine tolle user-experience und manchmal ist es das Ergebnis einer schlechten design, aber manchmal (ex UILocalNotification oder Sachen wie, dass) Sie nur passieren kann, und es ist Angst, die kann ich Locker eine wichtige Blockierung Alarm, nur weil meine app gerade eine Benachrichtigung erhalten.
Sagte, dies ist meine 2cents Lösung, eine rekursive Funktion, die versucht, zu präsentieren, die alertcontroller auf den Absender wenn der Absender keine presentedViewController, ansonsten versucht es zu präsentieren die alertcontroller auf die presentedViewController und so weiter... Es funktioniert nicht, wenn Sie Feuer mehr AlertController genau zur gleichen Zeit, weil Sie nicht moderieren kann einen viewcontroller aus einer Steuerung, die vorgestellt werden, es sollte aber in jedem anderen vernünftigen workflow.
Wenn alles, was Sie brauchen, ist einfach, Informationen, Warnungen, sind einfach zu Lesen und entließ, dann ist dies was ich kam mit (es ist nicht gerade fancy, high-level-code, und es gibt 'Kopplung' beteiligt, aber, hey... es ist kurz/einfach und kann in einigen Fällen hilfreich sein):
ReadOnlyMessageQueue.swift:
ViewController.swift:
Löste ich dieses problem mit dieser code-Zeile :