Puede usar solo un PickerView que muestra datos diferentes dependiendo de algunas condiciones.
Mi idea es la siguiente: podría crear, digamos, 8 arreglos diferentes, uno para poblar el UIPickerView dependiendo de qué UITextField se tocó. Declarar en la interfaz como NSArray e inicializar en viewDidLoad:
array1st = ...
array2nd = ...
array3d = ...
//and until 8.
a continuación, crear otro sólo para señalar la matriz que debe llenarlo (como NSArray *currentArray
) y usted ni siquiera necesita a init = que será utilizado solo para señalar la matriz correcta.
lo que debe establecer el delegado de los UITextFields a su controlador de vista, y en el método textFieldShouldBeginEditing
que comprobar quién es el UITextField, asignar la matriz correcta como el currentArray, recargar la UIPickerView con reloadData
, y volver NO en el mismo textFieldShouldBeginEditing
método. currentTextField es un puntero solo para saber qué es el "UITextField" actual que se está "editando"; necesitamos almacenarlo para poder establecer el texto después de seleccionar los datos en el selector. Declare currentTextField en la interfaz.
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
currentTextField = textField;
if (textField == myFirstTextView)
{
currentArray = array1st;
[pickerView reloadData];
[self animatePickerViewIn];
return NO;
}
//and this way until 8th
}
Así, cuando el controlador de vista, que en realidad es la UIPickerViewDelegate, que pueblan su UIPickerView de acuerdo a la matriz actual y no es necesario cambiar nada, sólo tiene que utilizar el currentArray como la matriz para obtener los datos de.
Ahora, para mostrar la pickerView:
Después de conectar el IBOutlet, en su viewDidLoad que debe hacer dos cosas: establecer el marco de la UIPickerView y añadirlo como una subvista:
pickerView.frame = CGRectMake(0,self.view.frame.size.height, pickerView.frame.size.width, pickerView.frame.size.height);
pickerView.delegate = self;
pickerView.dataSource = self;
//or you can do it via Interface Builder, right click the pickerView and then connect delegate and dataSource to the file's owner
[self.view addSubview:pickerView];
Ahora necesita crear el método llamado animatePickerViewIn
, que llamamos cuando el usuario toca el UITextField.
-(void)animatePickerViewIn
{
[UIView animateWithDuration:0.25 animations:^{
[pickerView setFrame:CGRectMake(0, pickerView.frame.origin.y-pickerView.frame.size.height, pickerView.frame.size.width, pickerView.frame.size.height)];
}];
}
para cargar los datos en el pickerView:
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [currentArray count];
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
-(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [currentArray objectAtIndex:row];
}
Y cuando el usuario selecciona la fila de la pickerView, lo recibirá como un método delegado. Así que simplemente establezca el texto del campo actualTexto como el valor seleccionado:
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
//and here you can do in two ways:
//1
[currentTextField setText:[currentArray objectAtIndex:row]];
//2
[currentTextField setText:[self pickerView:pickerView titleForRow:row inComponent:component]];
}
Hola, ¿puedes explicarme qué es textfield.tag? dice campo de texto no declarado en los casos de cambio? y myLocationPickerVer qué etiqueta de texto estamos configurando el texto? –
textfield.tag donde puede usar su campo de texto que ha declarado en el archivo .h y IBOutlate. Y el valor seleccionado de la vista del selector se muestra en la etiqueta usando label.text. Puede usar su etiqueta o cualquier otra cosa donde desee mostrar el valor seleccionado. –