UIPickerView - выбор первой строки не вызывает didSelectRow
У меня есть UIPickerView
на моем UIView
вместе с UITextField
. Я позволяю пользователю выбрать значение из сборщика или ввести пользовательское значение в текстовое поле.
Когда пользователь выбирает любую опцию из сборщика, значения переменных меняются штрафом (в методе pickerView:didSelectRow:inComponent:
). Но если пользователь не выбирает какое-либо значение на сборщике (coz они хотят выбрать первый вариант, который уже выбран), этот метод не вызывается, и выбор не отображается в переменной.
Я попытался установить значение по умолчанию для переменной в первый вариант в сборщике. Но в этом случае, когда пользователь редактирует текстовое поле, переменная будет иметь текст текстового поля. Теперь, если пользователь решает снова выбрать первое значение, новое значение не будет отражено в переменной.
Как я могу это преодолеть? Спасибо.
Здесь соответствующий код
В моем viewDidLoad
у меня есть этот оператор, чтобы по умолчанию установить selectText
в первый вариант сборщика
[self setSelectText:[myArray objectAtIndex:0]];
textFieldShouldReturn
- (BOOL)textFieldShouldReturn:(UITextField *)txtField{
[txtField resignFirstResponder];
[self setSelectText:txtField.text];
return YES;
}
PickerViewDelegate 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]]];
}
Проблема возникает, когда пользователь редактирует текст, а затем решает, что он все-таки хочет использовать первое значение сборщика. В этом случае они отклонят клавиатуру и нажимают на 1-ю опцию сборщика (который уже выбран). Это действие не вызывает didSelectRow
, поэтому значение selectText не изменяется.
Чтобы пользователь мог изменить значение selectText
, сначала нужно выбрать другое значение из подборщика, а затем выбрать 1-ю строку.
Ответы
Ответ 1
Вместо того, чтобы "подталкивать" значение сборщика каждый раз, когда вы делаете выбор с помощью этого кода:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
вам следует "вытащить его", когда пользователь нажимает кнопку (или другое событие, которое вы используете), используя что-то похожее на:
- (void)myAction:(id)sender
{
NSInteger row = [myPicker selectedRowInComponent:0];
selectedText = [myArray objectAtIndex:(NSUInteger)row];
}
Для очистки текста: класс UITextField
предоставляет встроенную кнопку для очистки текущего текста. Поэтому, если пользователь не хочет этого текста, он может отказаться от него.
myTextField.clearButtonMode = UITextFieldViewModeAlways;
Итак, в script вы проверите, имеет ли значение TextField
значение, если оно имеет значение u, используя TextField, если оно не имеет значения, вы извлекаете информацию из Picker
.
Ответ 2
Можете ли вы программно выбрать строку сразу после создания экземпляра UIPickerView?
int firstRow = 0;
int firstOptionIndex = 0;
[myPickerView selectRow:firstRow inComponent:firstOptionIndex animated:NO];
Эта последняя строка вызовет ваш метод делегирования pickerView:didSelectRow:inComponent
.
Другими словами, это должно установить значение переменной, где бы вы ее не хранили (NSArray
? not clear).
Ответ 3
-(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
}
Ответ 4
Вы можете напрямую вызвать метод делегата, например
picker.delegate?.pickerView?(picker, didSelectRow: 0, inComponent: 0)
Ответ 5
Чтобы прервать didSelectRow, не получив вызов в UIPickerView, когда пользователь выбрал первый элемент в списке, вы можете использовать UITapGestureRecognizer. (Пример кода в 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]
}
Используйте следующую ссылку UIGestureRecognizer Tutorial: Getting Started, чтобы получить работу распознавателя подключений (нужно добавить UIGestureRecognizerDelegate) и следующий код
class TransactionViewController: UIViewController, UITextFieldDelegate,UIPickerViewDataSource,UIPickerViewDelegate, UIGestureRecognizerDelegate { }
func gestureRecognizer(UIGestureRecognizer,
shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
return true
}