2017-05-04 4 views
3

Ich dachte, das war einfach: Immer wenn ich eine Remote-Benachrichtigung erhalten, während die App läuft präsentieren Sie einen UIAlertController mit der Nachricht.iOS: Warte auf bestehende Transition oder Präsentation zu beenden

Das Problem besteht darin, dass die Anzeige dieses Alarms genau dann erfolgen kann, wenn die Hauptanwendung einen anderen View-Controller verschiebt/anzeigt. In diesem Fall bekomme ich hässliche Fehlermeldungen wie

pushViewController:animated: called on <UINavigationController 0x7f400c00> while an existing transition or presentation is occurring; the navigation stack will not be updated.

und die App könnte in inkonsistente Zustände auf diese Weise erhalten. Wie kann ich View Controller-Übergänge so arrangieren, dass sie nicht in Konflikt geraten?

+0

Ich habe gerade ein vielversprechendes Experiment gemacht, das den Alarm in einem separaten UIWindow zeigt. Wenn das im Kontext der vollständigen App funktioniert, denke ich, dass ich eine schöne Lösung habe. –

Antwort

1

Die Trennung der Controller in zwei UIWindow s löst dieses Problem. Anstatt nur die Warnung auf einer der View-Controller App präsentiert erstellen Sie ein neues Fenster wie folgt aus:

let screen = UIScreen.main 
let screenBounds = screen.bounds 
let alertWindow = UIWindow(frame: screenBounds) 
alertWindow.windowLevel = UIWindowLevelAlert 
let vc = UIViewController() 
alertWindow.rootViewController = vc 
alertWindow.screen = screen 
alertWindow.isHidden = false 
vc.present(alert, animated: true) 

Nun ist die Ansicht-Controller in das Hauptfenster der Anwendung kann drücken und präsentieren andere Controller gleichzeitig Warnungen zeigt.

+0

Ich bin ein wenig verwirrt über die Tatsache, dass das neue 'UIWindow' verschwindet, wenn der Alarm abgewiesen wird. Ich dachte, ich müsste das Fenster manuell entfernen. Weiß jemand warum? –

+0

Das ist hacky aber scheint zu arbeiten ... cool !! – nverinaud

Verwandte Themen