2009-06-16 4 views
10

Ich muss die übergeordnete Ansicht auf einem iPhone aktualisieren, nachdem ich eine untergeordnete Ansicht aus dem Navigationsstapel entfernt habe. Wie kann ich die übergeordnete Ansicht so einrichten, dass sie benachrichtigt wird oder einen automatischen Methodenaufruf erhält, wenn das Kind vom Stapel entfernt wird und das übergeordnete Element wieder sichtbar wird?So rufen Sie automatisch eine Methode auf, nachdem Sie einen Ansichtscontroller vom Stapel auf dem iPhone entfernt haben

Der Benutzer gibt die Daten der untergeordneten Seite, die ich auf der übergeordneten Seite angezeigt werden soll, nachdem der Benutzer fertig ist und öffnet den Blick.

Danke für Ihre Hilfe!

Antwort

13

Ich habe gerade dieses selbe Problem gelöst - und die Antworten oben sind fast richtig, sie haben nur vergessen, den Delegierten zu setzen.

Ich habe einen Stammansicht-Controller, der die Größe einer Liste anzeigt, einen untergeordneten Ansichtscontroller aufruft, der die Größe einer Liste ändern kann, und die Größe bei der Rückkehr aktualisieren muss.

Wenn ich meine Eltern Ansicht (SettingsView unten) erstellen und es als Root-Ansicht eines UINavigationController hinzufügen, ich sicherstellen, dass die UINavigationController des Delegierten setzen, bevor ich die Ansicht angezeigt werden - das ist der Schlüssel Teil:

SettingsView *sv = [[SettingsView alloc] initWithNibName:@"SettingsView" bundle:nil]; 
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sv]; 
[nc setDelegate:sv]; 

In der übergeordneten Ansicht, implementieren das UINavigationControllerDelegate Protokoll:

@interface SettingsView : UIViewController <UINavigationControllerDelegate> 

und die willShowViewController Methode bieten:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    // Your code to update the parent view 
} 

Dies wird aufgerufen, nachdem die untergeordnete Ansicht geschlossen wurde und bevor die übergeordnete Ansicht erneut angezeigt wird.

+0

Wow danke, hatte das gleiche Problem. – drew010

+0

Vergessen Sie nicht, die richtige Antwort zu akzeptieren. –

+0

ur Beobachtung war sehr wichtig .... unforgiven3 Antwort ist richtig, aber wenn u das UINavigationControllerDelegate Protokoll in dem Viewcontroller, wo ur Berufung nicht implementieren willShowViewController es wird nie funktioniert, und auch die Eltern Viewcontroller halten ur beschweren Senden „Viewcontroller __strong zu Parameter der inkompatiblen Typ-ID

6

Ich hatte die Notwendigkeit, so etwas zu tun. Im Viewcontroller, dass mein UINavigationController Besitz hatte ich willShowViewController, wie dies umzusetzen:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
} 

Diese Methode wird aufgerufen, wenn die UINavigationController Ansichten ändert. Wenn ich deine Frage richtig verstehe, denke ich, das sollte tun, was du willst.

3

Ich denke, es gibt hier einige Verwirrung. UIView s werden nicht auf den Stapel UINavigationController geschoben. Was geschoben und geknallt wird, ist UIViewControllers, die wiederum jeweils eine oder (öfter) mehrere Ansichten verarbeiten.

Glücklicherweise ist die UIViewController diese Methoden hat:

-(void) viewWillAppear:(BOOL)animated; 
-(void) viewDidAppear:(BOOL)animated; 
-(void) viewWillDisappear:(BOOL)animated; 
-(void) viewDidDisappear:(BOOL)animated; 

Diese aufgerufen werden, wenn der Blick auf ist etwa (dis) erscheinen, oder hat gerade (dis) erschienen. Ich arbeite mit Tab-Bars, modalen Ansichten und Navigations-Controllern. (Und es ist eine gute Idee, diese zu verwenden, wenn Sie benutzerdefinierte Controller implementieren.)

Also in Ihrem Fall, wenn ich richtig verstehe, müssen Sie einfach die viewWillAppear: oder viewDidAppear: Methode auf, wie Sie das " Elternseite "(die vermutlich von einer UIViewController behandelt wird) und Code eingeben, um das Aussehen der Seite zu aktualisieren, um die gerade eingegebenen Daten widerzuspiegeln.

(wenn ich mich richtig erinnere, müssen Sie sicherstellen, dass die UINavigationController bekommt eine viewWill/DidAppear: Nachricht, wenn es zuerst in Reihenfolge angezeigt, für diese Nachrichten später an seine untergeordneten Controller gesendet werden. Wenn Sie diese Einstellung mit einer Vorlage oder in IB müssen Sie sich wahrscheinlich nicht darum kümmern.)

0

Wenn Sie einen Controller zu einem anderen benachrichtigen müssen, können Sie Delegierungsmuster wie beschrieben here (see 2nd answer) verwenden.

Leider gibt es keine automatische Benachrichtigung (AFAIK) für genaue Aufgabe wie Sie beschrieben. Um Ihre Anforderungen zu erfüllen, können Sie eine Nachricht an den Delegaten (d. H. An Ihren übergeordneten Controller) in viewWillDisappear Funktion Ihres untergeordneten Controllers senden.

+1

Das ist umständlich, wenn Ihr Kind Controller selbst ein Kind hat. In diesem Fall wird 'viewWillDisappear' aufgerufen, wenn das Kind das Enkelkind schiebt und wenn das Kind auftaucht. Nur im letzteren Fall möchten Sie den Eltern mitteilen. Ich muss noch einen eleganten Weg aus dieser Frage finden. –

2

Felixyz Antwort hat den Trick für mich getan. Wenn die Ansicht aufgerufen wird, wird die Methode den Code jedes Mal ausführen, wenn die Ansicht angezeigt wird. Anders als die Ansicht wurde geladen, die ihren Code nur ausführt, wenn die Ansicht zuerst geladen wird. Die übergeordnete Ansicht aktualisiert sich daher nicht, wenn eine untergeordnete Ansicht die im übergeordneten Element angezeigten Informationen ändert und anschließend aus dem Sack genommen wird. Wenn jedoch die Elternaufrufe angezeigt werden, wird der Code jedes Mal ausgeführt, wenn die Ansicht wieder angezeigt wird.

Stellen Sie sicher, die Super-Methode zur gleichen Zeit nennen. Die richtige Implementierung würde wie folgt aussehen:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    NSLog(@"View Appearing"); 
} 
Verwandte Themen