Vor iOS 13 wurden View Controller vorgestellt, mit denen der gesamte Bildschirm abgedeckt wurde. Beim Entlassen wurde die übergeordnete Ansichtssteuerungsfunktion viewDidAppear
ausgeführt.
Jetzt zeigt iOS 13 View Controller standardmäßig als Blatt an, was bedeutet, dass die Karte den zugrunde liegenden View Controller teilweise abdeckt, was bedeutet, dass viewDidAppear
dieser nicht aufgerufen wird, da der übergeordnete View Controller nie wirklich verschwunden ist.
Gibt es eine Möglichkeit zu erkennen, dass das präsentierte View Controller Sheet verworfen wurde ? Eine andere Funktion, die ich im übergeordneten Ansichts-Controller überschreiben kann, anstatt eine Art Delegat zu verwenden ?
Antworten:
Ja.
Nein. "Eine Art Delegierter" ist, wie Sie es tun. Machen Sie sich zum Delegierten des Präsentationscontrollers und überschreiben Sie ihn
presentationControllerDidDismiss(_:)
.https://developer.apple.com/documentation/uikit/uiadaptivepresentationcontrollerdelegate/3229889-presentationcontrollerdiddismiss
Das Fehlen eines allgemeinen zur Laufzeit generierten Ereignisses, das Sie darüber informiert, dass ein dargestellter Ansichtscontroller, ob im Vollbildmodus oder nicht, entlassen wurde, ist in der Tat problematisch. Dies ist jedoch kein neues Problem, da es immer Ansichts-Controller gab, die nicht im Vollbildmodus dargestellt wurden. Es ist nur so, dass es jetzt (in iOS 13) mehr davon gibt! Ich widme diesem Thema an anderer Stelle eine separate Frage und Antwort: Unified UIViewController wurde zur "vordersten" Erkennung? .
quelle
Hier ist ein Codebeispiel für einen übergeordneten Ansichts-Controller, der benachrichtigt wird, wenn der untergeordnete Ansichts-Controller, den er als Blatt darstellt (dh in der Standardmethode für iOS 13), verworfen wird:
Jerland2 Antwort ist verwirrt, da (a) die ursprünglichen Fragesteller einen Funktionsaufruf erhalten wollten , wenn das Blatt wird entlassen (während er presentationControllerDidAttemptToDismiss implementiert, das , wenn der Benutzer versucht , aufgerufen wird und nicht um das Blatt zu entlassen) und (b) Einstellung isModalInPresentation ist völlig orthogonal und macht das vorgestellte Blatt in der Tat unentbehrlich (was das Gegenteil von dem ist, was OP will).
quelle
Eine weitere Option, um zurück zu kommen
viewWillAppear
undviewDidAppear
ist eingestelltDiese Option deckt den Vollbildmodus ab und ruft nach dem Schließen die oben genannten Methoden auf
quelle
Für zukünftige Leser ist hier eine vollständigere Antwort mit der Implementierung:
quelle
presentationControllerDidDismiss
sollte funktionierenSchnell
Allgemeine Lösung zum Aufrufen
viewWillAppear
von iOS13quelle
dismiss(_)
.DRAG OR CALL DISMISS FUNC funktioniert mit dem folgenden Code.
1) Im Root-View-Controller teilen Sie das, was der Präsentations-View-Controller ist, als folgenden Code mit
2) Wiederum im Root View Controller teilen Sie mit, was Sie tun werden, wenn der Präsentations View Controller deaktiviert ist
1) Wenn Sie im Controller der Präsentationsansicht in diesem Bild auf die Schaltfläche Abbrechen oder Speichern klicken. Der folgende Code wird aufgerufen
quelle
Überschreiben Sie viewWillDisappear auf dem UIViewController, der entlassen wird. Sie werden über das
isBeingDismissed
Boolesche Flag auf eine Entlassung aufmerksam gemacht .** Wenn sich der Benutzer in der Mitte des Wischens befindet und die Karte wieder nach oben wischt, wird sie weiterhin als entlassen registriert, auch wenn die Karte nicht entlassen wird. Aber das ist ein Randfall, den Sie vielleicht nicht interessieren.
quelle
self.dismiss(animated: Bool, completion: (() -> Void)?)
Wenn jemand keinen Zugriff auf die präsentierte View - Controller, können sie außer Kraft setzen nur die folgende Methode bei der Präsentation View - Controller und die ändern
modalPresentationStyle
zufullScreen
können oder eine der Strategien mit diesem Ansatz oben genannten hinzufügenWenn der dargestellte Ansichts-Controller ein Navigations-Controller ist und Sie den Root-Controller überprüfen möchten, können Sie die obige Bedingung wie folgt ändern
quelle
Wenn Sie den ModalPresentationStyle in FullScreen verwendet haben, ist das Verhalten des Controllers wieder wie gewohnt.
ConsultarController controllerConsultar = this.Storyboard.InstantiateViewController ("ConsultarController") als ConsultarController; controllerConsultar.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; this.NavigationController.PushViewController (controllerConsultar, true);
quelle
Aus meiner Sicht sollte Apple nicht
pageSheet
die Standardeinstellung festlegenmodalPresentationStyle
Ich möchte den
fullScreen
Stil mithilfe von wieder auf den Standard zurücksetzenswizzling
So was:
Und dann setzen Sie diese Zeile zu Ihrem
AppDelegate
quelle
presentingViewController
sie nicht ausgelöst werdenviewWillAppear
viewWillAppear
war in gewissem Sinne immer falsch. Natürlich mag ich es nicht, wenn Apple mitkommt und den Boden unter mir herausschneidet. Aber wie gesagt, wir müssen einfach damit leben und die Dinge neu machen.presentedController
) präsentiert wird, und auch nicht weiß, was genau das istpresentingViewController
. Zum Beispiel: In einigen Fällen muss ich verwenden,UIViewController.topMostViewController()
was mir den obersten Ansichts-Controller im aktuellen Fenster zurückgibt. Deshalb möchte ich das Swizzling machen, um das aktuelle Verhalten beizubehalten und die richtigen Dinge (Daten aktualisieren, Benutzeroberfläche) inviewWillAppear
meinen View Controllern zu tun . Wenn Sie Ideen zur Lösung haben, helfen Sie bitte.Wäre es nicht einfach, den PresentingViewController.viewWillAppear aufzurufen? vor der Entlassung?
quelle