pickerview iphone uitextfield uipickerview

iphone - UIPickerView: la selección de la 1ª fila no llama a didSelectRow



textfield pickerview swift (5)

¿Puede seleccionar una fila mediante programación después de crear una instancia de UIPickerView?

int firstRow = 0; int firstOptionIndex = 0; [myPickerView selectRow:firstRow inComponent:firstOptionIndex animated:NO];

Esa última línea activará su método de delegado pickerView:didSelectRow:inComponent .

En otras palabras, eso debería establecer el valor de la variable, donde sea que la esté almacenando (¿ NSArray ? No está claro).

Tengo un UIPickerView en mi UIView junto con un UITextField . Estoy permitiendo que el usuario seleccione un valor del selector o ingrese un valor personalizado en el campo de texto.

Cuando el usuario selecciona cualquier opción del selector, los valores de las variables se cambian bien (en el pickerView:didSelectRow:inComponent: . Pero si el usuario no selecciona ningún valor en el selector (porque desea seleccionar la primera opción que ya está seleccionada), este método no se llama y la selección no se refleja en la variable.

Intenté establecer el valor predeterminado de la variable en la primera opción del selector. Pero en ese caso, cuando el usuario edita el campo de texto, la variable tendrá el texto del campo de texto. Ahora, si el usuario decide elegir el primer valor nuevamente, el nuevo valor no se refleja en la variable.

¿Cómo puedo superar esto? Gracias.

Aquí está el código relevante

En mi viewDidLoad tengo esta declaración para configurar el selectText a la primera opción del selector de forma predeterminada

[self setSelectText:[myArray objectAtIndex:0]];

textFieldShouldReturn

- (BOOL)textFieldShouldReturn:(UITextField *)txtField{ [txtField resignFirstResponder]; [self setSelectText:txtField.text]; return YES; }

PickerViewDelegate''s didSelectRow

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { // report the selection to the UI label [self setSelectText:[myArray objectAtIndex:[pickerView selectedRowInComponent:0]]]; }

El problema surge cuando el usuario edita el texto y luego decide que, después de todo, quiere usar el primer valor del selector. En ese caso, descartarán el teclado y harán clic en la primera opción del selector (que ya está seleccionada). Esta acción no llama a didSelectRow y, por lo tanto, el valor de selectText no se modifica.

Para que el usuario pueda cambiar el valor de selectText , primero tiene que seleccionar otro valor del selector y luego seleccionar la primera fila.


En lugar de "empujar" el valor del selector cada vez que realice una selección con este código:

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

debe "tirar de él" cuando el usuario haga clic en el botón (u otro evento que esté usando) utilizando algo similar a:

- (void)myAction:(id)sender { NSInteger row = [myPicker selectedRowInComponent:0]; selectedText = [myArray objectAtIndex:(NSUInteger)row]; }

Para borrar el texto: La clase UITextField proporciona un botón incorporado para borrar el texto actual. Entonces, si el usuario no quiere ese texto, puede descartarlo.

myTextField.clearButtonMode = UITextFieldViewModeAlways;

Entonces, en la secuencia de comandos, verificará si TextField tiene un valor, si tiene un valor u usa TextField, si no tiene un valor, extraiga la información del Picker .


Para superar la no selección de didSelectRow en UIPickerView cuando el usuario seleccionó el primer elemento de la lista, puede usar UITapGestureRecognizer. (Ejemplo de código en Swift)

self.txtTransType = self.makeTextField(self.transType, placeHolder: "Check-in or Check-out") self.txtTransType?.addTarget(self, action: "txtTransTypeEditing:", forControlEvents: UIControlEvents.EditingDidBegin) func makeTextField(text: String?, placeHolder: String) -> UITextField { var textField = UITextField(frame: CGRect(x: 140, y: 0, width: 220.00, height: 40.00)); textField.placeholder = placeHolder textField.text = text textField.borderStyle = UITextBorderStyle.Line textField.secureTextEntry = false; textField.delegate = self return textField } func txtTransTypeEditing(sender: UITextField) { var ttPickerView:UIPickerView = UIPickerView() ttPickerView.dataSource = self ttPickerView.delegate = self sender.inputView = ttPickerView let recognizer = UITapGestureRecognizer(target: self, action:Selector("handleTransTypePickerTap:")) recognizer.delegate = self ttPickerView.addGestureRecognizer(recognizer) } func handleTransTypePickerTap(recognizer: UITapGestureRecognizer) { let ttPickerView = recognizer.view as! UIPickerView let row = ttPickerView.selectedRowInComponent(0) self.txtTransType!.text = self.transTypeData[row] }

Use el siguiente enlace Tutorial de UIGestureRecognizer: Introducción para que funcione el reconocedor de tap (es necesario agregar UIGestureRecognizerDelegate) y el siguiente código

class TransactionViewController: UIViewController, UITextFieldDelegate,UIPickerViewDataSource,UIPickerViewDelegate, UIGestureRecognizerDelegate { } func gestureRecognizer(UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool { return true }


Puede llamar directamente al método del delegado como

picker.delegate?.pickerView?(picker, didSelectRow: 0, inComponent: 0)


-(void)textFieldDidBeginEditing:(UITextField *)textField { // Only for the text field with the picker if (textField == self.yourTextField && [textField length]!=0) { // Select the first row programmatically [self.categoriesPicker selectRow:0 inComponent:0 animated:YES]; // The delegate method isn''t called if the row is selected programmatically [self pickerView:self.categoriesPicker didSelectRow:0 inComponent:0]; } } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { //Do all the stuff to populate the TextField }