2012-07-23 20 views
8

Tengo 8 campos de texto en una vista. Quiero poblar cada uno usando una vista de selección. ¿Puedo tener 1 pickerview que muestre diferentes listas de elementos de diferentes matrices para diferentes campos de texto?¿Cómo usar un UIPickerView para múltiples campos de texto en una vista?

¿Puede alguien explicar cómo lo hago programáticamente con un código de muestra?

¿Cómo puedo ocultar la vista de selección cuando se carga la vista y debería mostrarse solo cuando hago clic en un campo de texto con su lista de datos correspondiente? Debería desaparecer cuando selecciono los datos y vuelvo a aparecer cuando hago clic en un campo de texto diferente con su correspondiente lista de datos y así sucesivamente.

Soy nuevo en xcode. Cualquier ayuda será muy apreciada. Gracias.

Respuesta

11

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]]; 
} 
0

1.Utilice una barra de herramientas con Done barButtonItem, que debería ocultar el selectorView.

2.Ahora dale a tus textValues ​​tagValues ​​como: textFiled1.tag=100; y luego usando este valor de etiqueta llena tu matriz pickerView.

3. Cuando el usuario selecciona cualquier valor de pickerView, en su método delegado escribir

if(textField.tag== @"Your Tag Value") 
{ 
     textField.text=[pickerArray objectAtIndex:row]; 
} 

Creo que se puede probar el código usted mismo, ahora que tiene la esencia de la solution.Good Suerte !!

1

Usar esto.

- (void)textFieldDidBeginEditing:(UITextField *)textField{ 
    MyPickervie.delegate=self; 
} 
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)myLocationPickerView; 
{ 
    return 1; 
} 

-(void)myLocationPickerView:(UIPickerView *)myLocationPickerView didSelectRow:   (NSInteger)row inComponent:(NSInteger)component; 
{ 

    switch(textfield.tag){ 
    Case 0: 
      label.text=[arraNo objectAtindex:row]; 
      break; 
    default: break; 
    } 
} 
-(NSInteger)myLocationPickerView:(UIPickerView *)myLocationPickerView numberOfRowsInComponent:(NSInteger)component; 
{ 

switch(textfield.tag){ 
    Case 0: 
      return [arrayNo count]; 
      break; 
    default: break; 
    } 
} 

-(NSString *)myLocationPickerView:(UIPickerView *)myLocationPickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component; 
{ 
    switch(textfield.tag){ 
    Case 0: 
      return [arrayNo objectAtIndex:row]; 
      break; 
    default: break; 
    } 

} 

Donde tiene que llevar 8 casos en condición de interruptor para llamar a una matriz diferente y configurarla en el selectorView.

+0

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? –

+0

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. –

1

He probado este código con 3 campos de texto.

Y encontró la solución perfecta a su problema.

1) Tome un UITextField global.

2) En el método delegado de edición del campo de texto, establezca el campo de texto global en el campo de texto actual.

3) En el método de cambio del valor del selector, establezca el texto del campo de texto global y cambiará el valor del campo de texto seleccionado.

El siguiente código funciona correctamente.

Disfrute de la codificación.

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView 
{ 
return 1; 
} 

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component 
{ 
return 10; 
} 

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
return [NSString stringWithFormat:@"Test %d",row + 1]; 

} 

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 

test.text = @"XYZ"; 

} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
test = textField; 

return YES; 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{  
[textField resignFirstResponder]; 

return YES; 
} 
+2

Hola, lo siento, estoy teniendo dificultades para seguir sus instrucciones ya que soy totalmente nuevo en xcode. ¿Puedes elaborar o explicar tus puntos 2 y 3? –

+1

- (BOOL) textFieldShouldBeginEditing: (UITextField *) textField y - (BOOL) textFieldShouldReturn: (UITextField *) textField son métodos delegados de UITextField. Gestionará la funcionalidad del teclado cuando se muestre el teclado. En este caso, solo ocultas el teclado y el selector de presente. – Hemang

+2

Y para el selector primero, los 4 métodos son métodos de delegado, que administrarán todas las funciones básicas del selector. es decir, número de filas en el selector, datos en el selector, qué hacer cuando se cambia el valor del selector y otras cosas .... Necesita configurar delegados en los archivos xib y .h del controlador de vista. – Hemang

Cuestiones relacionadas