2017-11-17 1 views
2

Gegeben:Wie kann ein PresendingViewController benachrichtigt werden, dass sein PresentedViewController sich selbst abgewiesen hat?

  • Viewcontroller A, die Viewcontroller B
  • Viewcontroller B hat keinen Hinweis auf Viewcontroller A (außer implizit die presentingViewController Eigenschaft)
  • Viewcontroller B ruft dismiss auf sich selbst präsentiert und tut nichts sonst

Was ich will, erreichen:

  • Viewcontroller A wissen will, wenn Viewcontroller B um einige Zustand

Einschränkungen aufzuräumen entlassen wurde:

  • Ich will nicht KVO verwenden
  • Ich möchte ViewController B oder sein Verhalten in keiner Weise ändern

Was ich bisher herausgefunden:

  • dismiss(animated:completion:)according to the documentation leitet den Anruf an seine presentingViewController. Aber wie es scheint dismiss(animated:completion:) ist nicht genannt, sondern eine private Methode _performCoordinatedPresentOrDismiss:animated:.
  • iOS documentation on presentingViewController ist irreführend. Es besagt, dass "der View-Controller, der präsentiert wurde, diese Eigenschaft auf den View-Controller eingestellt hat, der ihn präsentierte", aber das stimmt nicht. In iOS 11 verweist dies immer auf die Stammeltern-VC des VC, der present aufgerufen wurde. Ähnlich ist die documentation on presentedViewController irreführend. Es besagt, dass "der View-Controller, der die Methode aufgerufen hat, diese Eigenschaft auf den View-Controller gesetzt hat, den sie präsentiert hat", das ist nicht die ganze Geschichte. Jedes VC in der Hierarchie des VC (alle übergeordneten VCs und untergeordneten VCs), die present aufgerufen haben, zeigt auf dasselbe presentedViewController.
+0

Vielleicht Senden einer Benachrichtigung in 'viewWillDisappear' oder' viewDidDisappear' von ViewController B? – Koen

+0

Leider kann ich B nicht ändern. Ich könnte es in ein containerVC wickeln, wie ich in der Antwort unten beschrieben habe, aber nicht sehr nett – fabb

+0

Oder Unterklasse es? – Koen

Antwort

0

in Ihrem Controller A, kame es als UINavigationControllerDelegate und mit navigationController:didShowViewController markieren Sie die Darstellung von Steuerung B (isControllerBisPresented = true). Wenn viewDidAppear von B, prüfen Sie, ob isControllerBisPresented wahr ist.

+0

Weder ViewController A noch B ist ein UINavigationController, also hilft das leider nicht viel – fabb

+0

Haben Sie TabViewController, können Sie Ihre Architektur ein wenig erklären – ahmed

+0

Sowohl ViewController A und B sind einfache UIViewController-Unterklassen. Ich kann B nicht ändern. Ein vorgestelltes B mit einem Anruf zu "anwesend". – fabb

0

Ein hässlicher Workaround wäre die Verwendung eines Man-in-the-Middle, der etwas in deinit tut. So A präsentiert M, die B als ChildVC bettet. Wenn B sich selbst ablehnt, wird auch M implizit zurückgewiesen, also ist es deinit Methode sollte aufgerufen werden. Dort kann es A benachrichtigen, dass es entlassen wurde.

Dies ist fragil, da ein Referenzzyklus die Freigabe von M verhindern könnte, was dazu führen würde, dass A nicht gemeldet wird.Ich möchte lieber eine bessere Lösung finden.

Verwandte Themen