2009-05-01 18 views
69

Ho un'app per database iphone che carica uno UIPickerView con dati da una tabella. Voglio impostare la riga selezionata su una particolare riga dai dati in un'altra tabella.Seleziona riga Dopo aver caricato UIPickerView

ad esempio: Diciamo che ho uno UIPickerView che viene caricato con X numero di nomi degli utenti iPhone amici (il numero di nomi è variabile, potrebbe essere 1 o 1000 e tutti sono inseriti nel DB dall'utente) . L'utente di iPhone ha un set di preferenze che il loro migliore amico attuale è TED. Voglio che lo UIPickerView sia posizionato su TED quando viene visualizzato.

Dove chiamo selectRow?

Ho provato in viewDidAppear ma non è mai stato chiamato, in titleForRow che ha causato tutti i tipi di comportamento strano. viewDidLoad e viewWillAppear sono fuori questione perché non so ancora cosa c'è nell'origine dati del raccoglitore.

Grazie in anticipo.

+0

appena messo il codice di @jab nella sua risposta dopo il caricamento dei dati e dare delegato. Questo è quello che ha funzionato per me! –

risposta

134

Chiamarlo dopo aver recuperato i dati. Non so dove carichi i dati, quindi questo è solo un esempio di cosa dovrebbe funzionare. Se questo non ha senso, farmi sapere dove si sta caricando i dati in modo da poter piece insieme nella mia testa :)

-(void)viewDidLoad 
{ 
    // load data from sql 
    // self.someDataArray = DATAFROMSQL 
    [picker reloadAllComponents]; 
    [picker selectRow:0 inComponent:0 animated:YES]; 
} 
+0

Grazie, sto recuperando i dati nel viewDidLoad proprio come il tuo mockup. Ho dovuto creare un metodo per enumerare l'elenco per trovare l'indice delle corrispondenze, quindi impostare il selettore. Ho pensato che forse mi mancava un callback che poteva essere usato dopo che il picker è stato caricato e prima di tornare al ciclo degli eventi. –

+0

funziona, ma perché provoca così tanto ritardo nel caricare la vista? (in una situazione di tablature) – CularBytes

7

Luogo questo ovunque si inizializza il UIView che contiene il UIPickerView come una visualizzazione secondaria:

[myPickerView selectRow:rowWithTedsName inComponent:columnWithNames animated:NO]; 
39

C'è un problema comune quando un oggetto UIPickerView (predefinito) deve essere selezionato quando viene visualizzato inizialmente UIPickerView. Il problema è legato alla sequenza di eventi. Dalla lettura dei post precedenti, sembra che [pickerView selectRow: n] venga normalmente chiamato nell'evento ViewDidLoad dei controller di vista. Tuttavia, i dati di UiPickerView vengono caricati solo dopo l'evento ViewDidLoad, il che significa che qualsiasi codice di selezione in ViewDidLoad non avrà alcun effetto. Per rimediare, posiziona il codice di selezione in ViewDidAppear;

- (void) viewDidAppear:(BOOL)animated { 
[m_pickerView selectRow:nSelectedItem inComponent:0 animated:YES]; } 
4

Ho appena scoperto che sui 4.3 SDK i comportamenti di caricamento dei componenti sono diversi tra iPhone e iPad. Sull'iPhone, stavo per invocare selectRow: subito dopo l'inizializzazione della vista prima o dopo l'aggiunta alla gerarchia subview. Su iPad, tuttavia, la chiamata selectRow non ha prodotto risultati. Ho finito con l'utilizzo di un performSelector: withObject: afterDelay: chiamata per attendere 0,1 secondi prima di attivare selectRow: inComponent: animated :. Questo ha avuto risultati prevedibili su iPhone e iPad.

0

Se si desidera che la riga selezionata in modo permanente evidenziato utilizzare questo

myPickerView.subviews[0].subviews[0].subviews[2].backgroundColor = myPickerView.tintColor; 
1

Per rapido è semplicemente

self.picker?.selectRow(0, inComponent: 0, animated: true) 
Problemi correlati