22

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,他们首先必须从选择器中选择一些其他值,然后选择第一行。

4

5 回答 5

27

每次使用此代码进行选择时,而不是“推送”选择器的值:

- (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,如果它没有一个值,你从Picker.

于 2009-04-25T20:06:54.850 回答
9

您可以直接调用委托的方法,如

picker.delegate?.pickerView?(picker, didSelectRow: 0, inComponent: 0)
于 2017-03-15T15:20:51.737 回答
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
}
于 2015-02-03T11:55:49.030 回答
2

您可以在实例化 UIPickerView 后立即以编程方式选择一行吗?

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

最后一行将触发您的pickerView:didSelectRow:inComponent委托方法。

换句话说,这应该设置变量的值,无论你在哪里存储它(NSArray?不清楚)。

于 2009-04-25T19:57:54.730 回答
0

当用户选择列表中的第一项时,要克服在 UIPickerView 中未调用 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 to get tap recognitionr to work (需要添加 UIGestureRecognizerDelegate) 和以下代码

class TransactionViewController: UIViewController, UITextFieldDelegate,UIPickerViewDataSource,UIPickerViewDelegate, UIGestureRecognizerDelegate  { }

func gestureRecognizer(UIGestureRecognizer,
    shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
        return true
}
于 2015-06-18T07:23:48.113 回答