Ist parentViewController immer ein Navigationscontroller?

7

Ich habe mir vor einer Woche den Kopf kratzt, und jetzt, mit ein bisschen mehr Kakao-Erfahrung unter meinem Gürtel, habe ich das Gefühl, dass ich eine Ahnung davon habe, was passieren könnte.

Ich mache eine Anwendung, die von einem UINavigationController gesteuert wird. Im AppDelegate erstelle ich eine Instanz dieser Klasse, die "Seite 1" als Root View Controller verwendet.

%Vor%

Hier ist jetzt, wo ich das Problem habe. Von "Seite 1" möchte ich einen modalen Ansicht-Controller verwenden, der über die Benutzeroberfläche gleitet und dann verschwindet, sobald der Benutzer eine Bearbeitung vorgenommen hat. Ich benutze Code wie diesen, innerhalb von Page1ViewController:

%Vor%

Wenn der Modal View Controller weg ist, möchte ich einen Wert auf "Seite 1" ändern, basierend auf dem, was der Benutzer im Modal View Controller eingegeben hat. Also habe ich einen Code wie diesen geschrieben, der sich im Modal View Controller befindet:

%Vor%

Das Update auf Seite 1 fand nicht statt, und es dauerte lange, bis ich erkannte, dass die Nachricht "doSomethingPleaseWithSomeData" nicht an Page1ViewController gesendet wurde, sondern an den Navigation Controller.

Ist dies bei Verwendung von Navigation Controllern immer zu erwarten? Habe ich vielleicht etwas falsch konfiguriert? Gibt es eine einfache Möglichkeit, den gewünschten View Controller zu erhalten (in diesem Fall Page1ViewController).

    
bpapa 28.10.2008, 19:48
quelle

4 Antworten

14

Ich würde empfehlen, das Delegierungsmuster zu verwenden, um Ihr Problem zu lösen. Erstellen Sie eine Eigenschaft

%Vor%

Und ein entsprechendes Protokoll

%Vor%

Wenn der Benutzer mit Ihrer Ansicht fertig ist (z. B. die Speicherschaltfläche antippen), senden Sie folgende Nachricht:

%Vor%

Setzen Sie nun den Delegaten auf den View-Controller, der das Ganze verwalten soll, und er wird benachrichtigt, wenn der View-Controller fertig ist. Beachten Sie, dass Ihr View-Controller den Modalansicht-Controller schließen muss. Aber logisch, das macht Sinn, da es das Objekt war, das den Modal-View-Controller an erster Stelle präsentierte.

So löst Apple dieses Problem beispielsweise in UIImagePickerController und UIPersonPickerController.

    
Alex 11.11.2008, 15:51
quelle
4

Es gibt mehrere Möglichkeiten, wie Sie damit umgehen können. Am einfachsten ist es wahrscheinlich, nur eine UIViewController-Eigenschaft in myModalViewController hinzuzufügen und sie auf page1Controller zu setzen, bevor Sie sie präsentieren:

%Vor%

Stellen Sie nur sicher, dass Sie die entsprechende Instanzvariable @property und @synthesize für logicalParent zu myModalViewController hinzufügen, dann haben Sie eine Möglichkeit, Daten an den ViewController zurückzusenden, der den modalen Dialog ausgelöst hat. Dies dient auch dazu, Daten zwischen verschiedenen Navigationsebenen hin- und herzuübertragen, bevor Sie sie auf den Stapel schieben und dort ablegen.

Die eine wichtige Sache, um die Sie sich dabei kümmern müssen, ist, dass es leicht ist, Schleifen zu erhalten, wenn Sie nicht vorsichtig sind. Abhängig davon, wie genau Sie dies strukturieren, müssen Sie möglicherweise Eigenschaften zuweisen.

    
Louis Gerbarg 28.10.2008 20:08
quelle
1

Ich bin gerade auf dasselbe Problem gestoßen. Es scheint definitiv, dass, wenn Sie einen UIViewController in einen NavigationController eingebettet haben, dann, wenn Sie von diesem UIViewController einen anderen UIViewController modal präsentieren, der Präsentierende denkt, dass der Presenter der NavigationController ist. Mit anderen Worten, parentViewController ist falsch.

Ich wette, das ist ein Fehler: Entweder das, oder die Dokumentation scheint unvollständig zu sein. Ich werde nachfragen.

    
Michael 24.09.2010 15:39
quelle
1

Ich bin gerade auf dasselbe Problem gestoßen. Ich glaube, das ist ein Fehler. Mein Szenario ist folgendes: Eine Navigationshierarchie mit A, B und C zeigt Controller in dieser Reihenfolge an. Auf C gibt es eine Schaltfläche, die einen Modalansicht-Controller namens D öffnen würde. Sobald D angezeigt wird, löscht der Navigationscontroller C aus seiner Hierarchie, was ein schreckliches Verhalten ist. Sobald D abgewiesen wird, instanziiert der Navigationscontroller einen neuen Viewcontroller vom Typ C und schiebt ihn in seine Hierarchie, um den ursprünglichen Controller wiederherzustellen. Furchtbar. Meine Lösung ist das Hacken der Navigationshierarchie auf diese Weise (eine sehr schlechte Lösung, aber funktioniert gut. Mit einem 2-dimensionalen Array könnten Sie Stacking-Modalitäten implementieren):

%Vor%

Diese zwei Methoden sind definiert, wo ich die Hauptnavigation hiererchy: der App-Delegate. Navigation und Navigationshierarchie sind auf diese Weise definiert:

%Vor%     
zgobolos 18.12.2010 13:21
quelle

Tags und Links