我的UIPickerView
上有一个UIView
和UITextField
。我让用户从选择器中选择一个值,或在文本字段中输入自定义值。
当用户从选择器中选择任何选项时,变量值会在pickerView:didSelectRow:inComponent:
)方法中改变。但是如果用户没有在选择器上选择任何值(因为他们想要选择已经选择的第一个选项),则不会调用此方法,并且选择不会反映在变量中。
我尝试将变量的默认值设置为选择器中的第一个选项。但在这种情况下,当用户编辑文本字段时,变量将具有文本字段的文本。现在,如果用户决定再次选择第一个值,则新值不会反映在变量中。
我怎样才能克服这一点?感谢。
这是相关代码
在我的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]]];
}
当用户编辑文本然后决定他想要使用选择器的第一个值时,就会出现问题。在这种情况下,他们将关闭键盘并单击选择器的第一个选项(已选中)。此操作不会调用didSelectRow
,因此selectText的值不会更改。
为了让用户能够更改selectText
的值,他们首先必须从选择器中选择一些其他值,然后选择第一行。
答案 0 :(得分:26)
每次使用此代码进行选择时,不要“推”选择器的值:
- (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;
所以在脚本中,你会检查TextField
是否有值,如果它有值,你使用TextField,如果它没有值,你从{{中提取信息1}}。
答案 1 :(得分:5)
您可以直接调用委托的方法,如
picker.delegate?.pickerView?(picker, didSelectRow: 0, inComponent: 0)
答案 2 :(得分: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
}
答案 3 :(得分:2)
您可以在实例化UIPickerView后立即以编程方式选择行吗?
int firstRow = 0;
int firstOptionIndex = 0;
[myPickerView selectRow:firstRow inComponent:firstOptionIndex animated:NO];
最后一行将触发您的pickerView:didSelectRow:inComponent
委托方法。
换句话说,那应该设置变量的值,无论你在哪里存储它(NSArray
?不清楚)。
答案 4 :(得分:0)
为了克服当用户选择列表中的第一项时USeickerView中没有调用didSelectRow,您可以使用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
}