2012-07-23 5 views
8

Ho 8 campi di testo in una vista. Voglio popolarlo usando un pickpan. Posso avere 1 pickerview che visualizzerà un elenco di elementi diversi da matrici diverse per diversi campi di testo?Come utilizzare un UIPickerView per più campi di testo in un'unica vista?

Qualcuno può spiegare come posso fare a livello di codice con un codice di esempio?

anche come posso nascondere il pickerView quando e dovrebbe essere visualizzato i carichi vista solo quando clicco su un campo di testo con la sua lista di dati corrispondente? Dovrebbe scomparire quando seleziono i dati e riappare quando faccio clic su un altro campo di testo con il relativo elenco di dati e così via.

Sono nuovo di xcode. Qualsiasi aiuto sarà molto apprezzato. Grazie.

risposta

11

È possibile utilizzare solo un PickerView che mostra dati diversi a seconda di alcune condizioni.

La mia idea è la seguente: è possibile creare, diciamo, 8 diversi array: uno per popolare UIPickerView in base a quale UITextField è stato toccato. li Dichiarare nell'interfaccia come NSArray e inizializzare in viewDidLoad:

array1st = ... 
array2nd = ... 
array3d = ... 
//and until 8. 

quindi si crea un altro solo per indicare la matrice che dovrebbe riempire (come NSArray *currentArray) e che non hanno nemmeno bisogno di init it = sarà usato solo per indicare la matrice corretta.

così si dovrebbe impostare il delegato dei UITextFields al vostro controller della vista, e nel metodo textFieldShouldBeginEditing si controlla chi è l'UITextField, assegnare la matrice corretta come il currentArray, ricaricare l'UIPickerView con reloadData, e tornare NO nello stesso Metodo textFieldShouldBeginEditing. currentTextField è un puntatore solo per sapere qual è il correnteUITextField che viene "modificato" - dobbiamo memorizzarlo per poter impostare il testo dopo aver selezionato i dati nel selettore. Dichiara currentTextField nell'interfaccia.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    currentTextField = textField; 
    if (textField == myFirstTextView) 
    { 
     currentArray = array1st; 
     [pickerView reloadData]; 
     [self animatePickerViewIn]; 
     return NO; 
    } 
    //and this way until 8th 
} 

Così, quando il controller della vista, che in realtà è l'UIPickerViewDelegate, è popolare l'UIPickerView secondo alla matrice corrente e non c'è bisogno di cambiare nulla, basta usare la currentArray come la matrice per ottenere i dati a partire dal.

Ora, per mostrare la pickerView:

Dopo aver collegato l'IBOutlet, nella vostra viewDidLoad si dovrebbe fare due cose: impostare la cornice del UIPickerView e aggiungerlo come una visualizzazione secondaria:

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

Ora è necessario creare il metodo chiamato animatePickerViewIn, che abbiamo chiamato quando l'utente tocca 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)]; 
    }]; 
} 

per caricare i dati nel 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]; 
} 

E quando l'utente seleziona la riga della pickerView, si riceverà come metodo delegato. Quindi basta impostare il testo di currentTextField come valore selezionato:

-(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. Usare una barra degli strumenti con Done barButtonItem, che dovrebbe nascondere il pickerView.

2. Date il vostro testoCampi di campiValori come: textFiled1.tag=100; quindi usando questo valore di tag popola l'array pickerView.

3. Quando l'utente seleziona qualsiasi valore da pickerView, nel suo metodo delegato scrivere

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

Credo che si può provare il codice da soli, ora che avete il senso della solution.Good fortuna !!

1

Utilizzare questo.

- (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; 
    } 

} 

Dove devi prendere 8 casi in condizione di commutazione per chiamare array diversi e impostarlo nel pickerView.

+0

Ciao, puoi spiegare cos'è textfield.tag? dice textfield non dichiarato nei casi di switch? e myLocationPickerView a quale label.text impostiamo il testo? –

+0

textfield.tag dove puoi usare il tuo campo di testo che hai dichiarato nel file .h e IBUtilizzarlo. E il valore selezionato dalla vista di selezione viene visualizzato nell'etichetta usando label.text. È possibile utilizzare l'etichetta o qualsiasi cosa in cui si desidera visualizzare il valore selezionato. –

1

Ho testato questo codice con 3 campi di testo.

E ha trovato la soluzione perfetta del tuo problema.

1) Prendere un UITextField globale.

2) Su un metodo delegato di modifica del testo, impostare il testo globale sul campo di testo corrente.

3) Nel metodo di modifica del valore del selettore, impostare il testo del campo di testo globale e cambierà il valore del campo di testo selezionato.

Il codice riportato di seguito funziona correttamente.

Godetevi la codifica.

- (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

Ciao, scusa Sto avendo difficoltà a seguire le tue istruzioni perché sono totalmente nuovo a xcode. Puoi elaborare o spiegare i tuoi 2 ° e 3 ° punto? –

+1

- (BOOL) textFieldShouldBeginEditing: (UITextField *) textField e - (BOOL) textFieldShouldReturn: (UITextField *) textField sono metodi delegati di UITextField. Gestirà la funzionalità della tastiera quando mostrare la tastiera. In questo caso devi solo nascondere la tastiera e il selettore presente. – Hemang

+2

E per il picker i primi 4 metodi sono metodi delegati, che gestiranno tutte le funzionalità di base del raccoglitore. Ad esempio numero di righe nel selettore, dati nel selettore, cosa fare quando il valore del raccoglitore è cambiato e altre cose .... È necessario impostare i delegati in xib e .h file del controller di visualizzazione. – Hemang

Problemi correlati