Come chiamare automaticamente un metodo dopo aver rimosso un controller di visualizzazione dallo stack sull'iPhone

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

  •  05-07-2019
  •  | 
  •  

Domanda

Devo aggiornare la vista padre su un iPhone dopo aver spuntato una vista figlio dallo stack di navigazione. Come posso impostare la vista padre per ricevere una notifica o ricevere una chiamata di metodo automatica quando il figlio viene espulso dallo stack e il padre diventa di nuovo visibile?

L'utente inserisce i dati nella pagina figlio che voglio visualizzare nella pagina padre dopo che l'utente ha terminato e ha aperto la vista.

Grazie per l'aiuto!

È stato utile?

Soluzione

Ho appena risolto questo stesso problema - e le risposte sopra sono quasi corrette, si sono appena dimenticate di impostare il delegato.

Ho un controller di visualizzazione root che visualizza le dimensioni di un elenco, chiama un controller di visualizzazione figlio che può modificare le dimensioni di un elenco e deve aggiornare le dimensioni al ritorno.

Quando creo la vista padre (ImpostazioniView di seguito) e la aggiungo come vista radice di un UINavigationController, mi assicuro di impostare il delegato di UINavigationController prima di visualizzare la vista - questa è la parte chiave:

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

Nella vista padre, implementa il protocollo UINavigationControllerDelegate:

@interface SettingsView : UIViewController <UINavigationControllerDelegate>

e fornisci il metodo willShowViewController:

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

Viene chiamato dopo che la vista figlio è stata eliminata e prima che la vista padre venga nuovamente visualizzata.

Altri suggerimenti

Avevo anche bisogno di fare qualcosa del genere. Nel ViewController che possedeva il mio UINavigationController , dovevo implementare willShowViewController , in questo modo:

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

Questo metodo viene chiamato ogni volta che UINavigationController cambia vista. Se capisco correttamente la tua domanda, penso che questo dovrebbe fare quello che vuoi.

Penso che ci sia un po 'di confusione qui. Gli UIView non vengono inseriti e spuntati dallo stack di UINavigationController . Ciò che viene spinto e spuntato è UIViewControllers , che a sua volta gestisce una o (più spesso) più viste ciascuna.

Fortunatamente, UIViewController ha questi metodi:

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

Questi vengono chiamati ogni volta che la vista sta per apparire (dis) o è appena apparsa (dis). Lavoro con barre di tabulazione, viste modali e controller di navigazione. (Ed è una buona idea farne uso quando si implementano controller personalizzati.)

Quindi nel tuo caso, se ho capito bene, devi semplicemente ignorare il viewWillAppear : o viewDidAppear : metodo su ciò che chiami la "pagina padre"; (che è presumibilmente gestito da un UIViewController ) e inserito nel codice per aggiornare l'aspetto della pagina in modo da riflettere i dati appena inseriti.

(Se ricordo bene, devi assicurarti che UINavigationController riceva un messaggio viewWill / DidAppear: quando viene visualizzato per la prima volta, affinché questi messaggi possano essere successivi essere inviato ai controller secondari. Se lo configuri con un modello o in IB, probabilmente non devi preoccuparti.)

La risposta di Felixyz ha fatto il trucco per me. Chiamando la vista apparirà il metodo eseguirà il codice in esso ogni volta che appare la vista. Diverso dalla vista è stato caricato, che esegue il suo codice solo quando la vista viene caricata per la prima volta. Pertanto, la vista del genitore non si aggiornerebbe se una vista del figlio alterasse le informazioni visualizzate nel genitore e venisse quindi estratta dal sacco. Ma se viene visualizzata la vista delle chiamate dei genitori, il codice viene eseguito ogni volta che la vista viene visualizzata come backup.

Assicurati di chiamare il metodo super allo stesso tempo. La corretta implementazione sarebbe simile a questa:

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

Se è necessario notificare un controller a un altro, è possibile utilizzare il modello di delega come descritto qui (vedi seconda risposta) .

Purtroppo non esiste una notifica automatica (AFAIK) per l'attività esatta come descritto. Per soddisfare le tue esigenze puoi inviare un messaggio al delegato (ad esempio al tuo controllore principale) nella funzione viewWillDisappear del tuo controllore figlio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top