Ist parentViewController immer eine Navigations-controller?
War ich irgendwie meinen Kopf kratzen, an diese eine Woche, und jetzt mit ein wenig mehr Kakao-Erfahrung unter dem Gürtel ich fühle mich wie ich haben eine Ahnung, was vor sich geht.
Mache ich eine Anwendung, die angetrieben wird von einem UINavigationController. In der AppDelegate habe ich erstellen Sie eine Instanz dieser Klasse mithilfe der "Seite 1" als Root-View-Controller.
UINavigationController *aNavigationController = [[UINavigationController alloc]
initWithRootViewController:page1ViewController];
Nun, hier ist, wo ich bin mit dem problem. Von "Seite 1" ich würde gerne eine modal-view-controller, gleitet über die Oberfläche und dann verschwindet, sobald der user hat Bearbeiten. Ich Mach das mit code wie diesem, in Page1ViewController:
[self presentModalViewController:myModalViewController animated:YES];
Wenn der Modal-View-Controller ist Weg, ich will den Wert auf "Seite 1" zu ändern, basierend auf was der Benutzer eingegeben in der Modal-View-Controller. Also, ich schrieb einige code wie dieser, welche sich in der Modal-View-Controller:
[self.parentViewController dismissModalViewControllerAnimated:YES];
[self.parentViewController doSomethingPleaseWithSomeData:someData];
Dem update auf Seite 1 war nicht passiert, und es dauerte eine lange Zeit, um zu erkennen, dass die "doSomethingPleaseWithSomeData" Nachricht wurde nicht gesendet, um Page1ViewController, aber die Navigation-Controller.
Ist dies immer dann zu erwarten, wenn Sie mit der Navigation-Controller? Habe ich vielleicht konfigurieren etwas falsch? Gibt es eine einfache Möglichkeit, um auf die Ansicht-Controller, den ich haben möchte (in diesem Fall Page1ViewController).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde empfehlen, mit der delegation Muster, um Ihr problem zu lösen. Erstellen Sie eine Eigenschaft,
Und ein entsprechendes Protokoll
Wenn der Benutzer endet mit dem Blick (z.B. Antippen der Schaltfläche speichern), senden Sie diese Nachricht:
Nun setzen die Delegierten auf den view-controller, das sollte zu verwalten, die ganze Sache, und es wird benachrichtigt, wenn das view-controller abgeschlossen ist. Beachten Sie, dass Sie müssen Ihre view-controller zu entlassen, der modal-view-controller. Aber, logisch, das macht Sinn, da es das Objekt, das präsentiert der modal-view-controller in den ersten Platz.
Dies ist, wie Apple dieses problem löst-beispielsweise die UIImagePickerController und UIPersonPickerController.
Gibt es ein paar Möglichkeiten, wie Sie damit umgehen. Die einfachste ist wohl einfach zu fügen Sie eine UIViewController-Eigenschaft in myModalViewController und legen Sie es auf page1Controller bevor Sie es:
Nur stellen Sie sicher, fügen Sie die entsprechenden Instanz-variable @property und @synthetisieren für logicalParent zu myModalViewController, dann haben Sie einen Weg zu kommunizieren, Daten zurück an den ViewController, dass der Auslöser für den modalen dialog. Dies ist auch für die übergabe von Daten hin und her zwischen verschiedenen Ebenen der navigation, bevor Sie die push und pop auf dem stack.
Es eine wichtige Sache zu kümmern, wenn dies zu tun, ist, dass es leicht zu bekommen, behalten Schleifen, wenn Sie nicht vorsichtig sind. Je nachdem, wie genau Sie die Struktur dieses müssen Sie möglicherweise verwenden, weisen Sie Eigenschaften.
Ich lief in das gleiche problem. Es scheint durchaus, dass wenn Sie eine UIViewController eingebettet in einen NavigationController, dann, wenn, aus, dass UIViewController Sie stellen auch ein UIViewController Modal, die Beschenkten denkt, dass der Moderator ist der NavigationController. In anderen Worten, parentViewController ist falsch.
Ich Wette, das ist ein bug: entweder das, oder die Dokumentation unvollständig ist. Ich werde mich erkundigen.
Gerade lief in das gleiche problem. Ich glaube das ist ein bug. Mein Szenario ist Folgendes:
Eine navigationshierarchie mit A -, B-und C-view-Controller in dieser Reihenfolge. Auf C gibt es eine Schaltfläche, die dem öffnen eines modalen view-controller genannt, D. Sobald D präsentiert sich der navigation-controller C Tropfen aus Ihrer Hierarchie, das ist ein schreckliches Verhalten. Sobald D wird entlassen, der navigation-controller instanziiert eine neue C-type view-controller und schiebt es in seine Hierarchie zu erholen Sie das original ein. Schrecklich. Meine Lösung ist das hacken der Navigations-Hierarchie auf diese Weise (eine sehr schlechte Lösung, aber funktioniert gut. mit einem 2-dimensionales array, die Sie umsetzen konnte-stacking-Modelle) einstellen:
Diese zwei Methoden definiert, wo ich behaupte die Hauptnavigation hiererchy: die app delegieren. navigation und navigationhierarchy sind auf diese Weise definiert: