È 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]];
}
Ciao, puoi spiegare cos'è textfield.tag? dice textfield non dichiarato nei casi di switch? e myLocationPickerView a quale label.text impostiamo il testo? –
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. –