2009-09-22 8 views
6

Ho un UITableViewController nella mia app, che viene aggiunto direttamente alla gerarchia della vista. Quando viene visualizzata la vista, voglio scorrere fino a una cella specifica. La mia soluzione sarebbe quella di chiamare il codice per lo scorrimento in -[viewDidAppear].Tempo corretto per chiamare viewDidAppear manualmente?

Secondo la documentazione di Apple devo chiamare il metodo manuale:

Se si aggiunge a una gerarchia vista direttamente la vista appartenenza ad un controller di vista, il controller della vista sarà non ricevere questo messaggio. Se si inserisce o si aggiunge una vista alla gerarchia della vista e questo ha un controller della vista, è necessario inviare direttamente al messaggio il controllore della vista associato.

La domanda è: quando è il momento giusto per chiamarlo manualmente?

Chiamarlo dal -[viewDidAppear] porta la vista del controllore genitore di un crash quando cerco di fare lo scrolling perché a quanto pare, in realtà non ha compare ancora la vista tavolo e pensa quindi non ha sezioni per scorrere.

risposta

1

Chiamarlo dal controller principale -viewDidAppear è solitamente la soluzione migliore.

Se questo genera problemi se il controller di visualizzazione figlio non è ancora completamente inizializzato, potrebbe esserci un altro problema. Assicurarsi che il controller di vista bambino è completamente "pronto per l'azione" dopo -viewWillAppear è chiamato (che si può anche chiamare manualmente dal genitore -viewWillAppear)

1

In - [viewDidAppear] sul Tableview, chiamato anzi dal controllore della vista genitore - [viewDidAppear], puoi chiamare [tableView reloadData], in questo modo assicuri che tableView sia caricato e pronto.

0

Ecco come chiamo manualmente viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear: here

e uno dei controller di vista che carico in questo modo, ha la seguente viewWillAppear: (si noti che questo è viewWillAppear dato che al punto che viewDidAppear viene chiamato, la visualizzazione è visualizzabile dall'utente)

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [wordListTable reloadData]; 
    [wordListTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; 
} 
-1

qual è l'errore di arresto che si ottiene quando lo hai chiamato? potrebbe essere possibile che tu non mantenga correttamente la tua tableview.

7

Se si utilizza il contenimento del controller di visualizzazione, non chiamare direttamente viewWillAppear:. Utilizzare invece – beginAppearanceTransition:animated: e – endAppearanceTransition.

Se si sta implementando un controller contenitore personalizzato, utilizzare questo metodo per comunicare al bambino che le sue viste stanno per apparire o scomparire. Non richiamare viewWillAppear :, viewWillDisappear :, viewDidAppear :, o viewDidDisappear: direttamente.

Calling addSubView attiverà automaticamente viewWillAppear: e viewDidAppear: se della vista viewController è un controller di vista del bambino, quindi chiamando direttamente viewWillAppear: attiveranno metodo aspetto vista volontà due volte.Usando beginAppearanceTransition: animated: and - endAppearanceTransition` sopprimerà il comportamento automatico in modo che venga richiamato solo una volta.