Wie automatisch eine Methode aufrufen, nachdem ein View-Controller aus dem Stapel auf dem iPhone popping

StackOverflow https://stackoverflow.com/questions/1001441

  •  05-07-2019
  •  | 
  •  

Frage

Ich brauche die Elternansicht auf einem iPhone zu aktualisieren, nachdem ein Kind das Navigationsstapel sieht weg knallen. Wie kann ich die übergeordnete Ansicht Setup informiert werden oder eine automatische Methode Anruf erhalten, wenn das Kind von dem Stapel genommene wird und die Eltern wieder sichtbar wird?

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

Danke für deine Hilfe!

War es hilfreich?

Lösung

ich dieses Selbst gleiche Problem nur gelöst -. Und die Antworten oben sind fast richtig, sie haben nur vergessen, über den Delegaten Einstellung

Ich habe einen Root-View-Controller, der die Größe einer Liste angezeigt wird, ruft ein Kind-View-Controller, der die Größe einer Liste ändern kann und muss die Größe bei der Rückkehr aktualisieren.

Wenn ich meine Eltern Ansicht (SettingsView unten) erstellen, und fügen Sie es als Root-Ansicht eines UINavigationController, 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 geben Sie die willShowViewController Methode:

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

Dies wird aufgerufen, nachdem das Kind Ansicht des Feldes verwiesen, und bevor die Elternansicht erneut angezeigt wird.

Andere Tipps

hatte ich das Bedürfnis, auch so etwas zu tun. In der Viewcontroller , die meine im Besitz UINavigationController , hatte ich willShowViewController , wie dies zu implementieren:

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

Diese Methode wird aufgerufen, wenn die UINavigationController ändern Ansichten. Wenn ich Ihre Frage richtig zu verstehen, ich denke, das sollte das tun, was Sie wollen.

Ich denke, es gibt hier einige Verwirrung. UIViews nicht geschoben und aus dem UINavigationController des Stapel geholt. Was geschoben wird und knallte ist UIViewControllers, was wiederum behandeln eine oder (häufiger) mehrere Ansichten, die jeweils.

Glücklicherweise hat die UIViewController diese Methoden:

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

Diese werden aufgerufen, wenn der Blick auf ist etwa (dis) erscheinen, oder hat gerade (dis) erschienen. Ich arbeite mit Tab Bars, modal Ansichten und Navigation Controller. (Und es ist eine gute Idee, hiervon Gebrauch zu machen, wenn Sie benutzerdefinierte Controller implementieren.)

Also in Ihrem Fall, wenn ich das richtig verstehen, muss man einfach die viewWillAppear außer Kraft setzen: oder viewDidAppear: Methode auf, was Sie die „übergeordnete Seite“ nennen (die vermutlich von einem UIViewController behandelt wird) und in Code setzen aktualisieren die Darstellung der Seite der Daten gerade eingegeben zu reflektieren.

(wenn ich mich richtig erinnere, müssen Sie sicherstellen, dass der UINavigationController eine viewWill/DidAppear: Nachricht erhält, wenn es zum ersten Mal angezeigt wird, um für diese Nachrichten später an seinen untergeordneten Controller gesendet werden. Wenn Sie diese mit einer Vorlage oder in IB Sie wahrscheinlich müssen darüber keine Sorge.)

Felixyz Antwort hat den Trick für mich. Der Aufruf der Ansicht wird Methode erscheint den Code in es jedes Mal, wenn der Blick erscheint laufen. Anders als bei Ansicht tat Last, die nur seinen Code ausgeführt wird, wenn der Blick zuerst geladen wird. So Ihre Eltern Ansicht würde sich nicht aktualisieren, wenn ein Kind Ansicht, die die Informationen in der übergeordneten angezeigt geändert, und wurde dann den Sack tauchte ab. Aber wenn die Eltern anruft, wird Ansicht erscheinen, wird der Code jedes Mal läuft der Blick nach oben zeigt, zurück.

Stellen Sie sicher, die Super-Methode zur gleichen Zeit nennen. Die ordnungsgemäße Umsetzung würde wie folgt aussehen:

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

Wenn Sie benötigen einen Controller zu einem anderen benachrichtigen Sie Delegation Muster wie beschrieben verwenden hier (zweite Antwort sehen).

Leider gibt es keine automatische Benachrichtigung (AFAIK) für genaue Aufgabe, wie Sie beschrieben. Um Ihre Bedürfnisse Sie können Nachricht senden zu delegieren (das heißt an Ihren Eltern Controller) in viewWillDisappear Funktion Ihres Kind Controller.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top