2009-05-01 10 views
69

Tengo una aplicación de base de datos de iphone que carga un UIPickerView con datos de una tabla. Quiero establecer la fila seleccionada a una fila particular de los datos en otra tabla.Seleccionar fila Después de cargar UIPickerView

por ejemplo: digamos que tengo un UIPickerView que está cargado con un número X de nombres de los usuarios de iPhone amigos (el número de nombres es variable, podría ser 1 o 1000 y todos son ingresados ​​en el DB por el usuario) . El usuario de iPhone tiene una preferencia establecida de que su mejor amigo actual es TED. Quiero que el UIPickerView esté en posición TED cuando se muestre.

¿Dónde puedo llamar al selectRow?

Intenté en viewDidAppear pero nunca fue llamado, en titleForRow que causó todo tipo de comportamiento extraño. viewDidLoad y viewWillAppear están fuera de cuestión porque todavía no sé qué hay en el origen de datos para el selector.

Gracias de antemano.

+0

Sólo hay que poner el código @jab en su respuesta después de la carga de datos y dando delegado. ¡Eso es lo que funcionó para mí! –

Respuesta

134

Llámalo después de recuperar los datos. No sé dónde cargan los datos, así que esto es solo una maqueta de lo que debería funcionar. Si esto no tiene sentido, que me haga saber donde se cargan datos para que pueda armarlo en mi cabeza :)

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

Gracias, estoy recuperando los datos en viewDidLoad al igual que su maqueta. Tuve que crear un método para enumerar a través de la lista para encontrar el índice de coincidencias y luego configurar el selector. Pensé que quizás me estaba perdiendo una devolución de llamada que podría usarse después de que se cargó el selector y antes de volver al ciclo de eventos. –

+0

funciona, pero ¿por qué causa tanto retraso al cargar la vista? (en una situación de barra de pestañas) – CularBytes

7

lugar este donde quiera que inicializar el UIView que contiene su UIPickerView como subvista:

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

Existe un problema común cuando se debe seleccionar un elemento UIPickerView (predeterminado) cuando se muestra inicialmente UIPickerView. El problema está relacionado con la secuencia de eventos. Al leer las publicaciones anteriores, parece que [pickerView selectRow: n] normalmente se llama en el evento viewDidLoad de los controladores de vista. Sin embargo, los datos de UiPickerView solo se cargan después del evento ViewDidLoad, lo que significa que cualquier código de selección en ViewDidLoad no tendrá ningún efecto. Para remediarlo, coloque el código de selección en ViewDidAppear;

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

Acabo de encontrar que en el SDK 4.3 los comportamientos de carga de los componentes son diferentes entre el iPhone y el iPad. En el iPhone, estaba a punto de invocar selectRow: justo después de inicializar la vista antes o después de agregarla a la jerarquía de la subvista. Sin embargo, en iPad, la llamada a selectRow no arrojó ningún resultado. Terminé usando un performSelector: withObject: afterDelay: call para esperar 0.1 segundos antes de disparar selectRow: inComponent: animado :. Esto tuvo resultados predecibles en el iPhone y el iPad.

0

Si desea que la fila seleccionada resaltada permanentemente utilizar este

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

Para rápida es simplemente

self.picker?.selectRow(0, inComponent: 0, animated: true) 
Cuestiones relacionadas