显示 UIPickerView 文本字段被选中,然后在选中后隐藏

Posted

技术标签:

【中文标题】显示 UIPickerView 文本字段被选中,然后在选中后隐藏【英文标题】:Show UIPickerView text field is selected, then hide after selected 【发布时间】:2014-11-08 16:35:43 【问题描述】:

我正在尝试创建一个文本框,当它被选中时,一个 UIPickerView 会打开一个可供选择的选项。选择后,UIPickerView 将隐藏,所选项目显示在文本框中。我尝试了在网上找到的不同代码段,但我无法让它工作。如果有人可以为此建议一个完整的代码或告诉我我在代码中做错了什么,那将是非常棒的。非常感谢。

这是我的代码:

@IBOutlet var textfieldBizCat: UITextField!
@IBOutlet var pickerBizCat: UIPickerView! = UIPickerView()

var bizCat = ["Cat One", "Cat Two", "Cat Three"]


override func viewDidLoad() 
    super.viewDidLoad()

    var bizCatCount = bizCat.count

    self.textfieldBizCat.inputView = pickerView



// returns the number of 'columns' to display.
func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int
    return 1


// returns the # of rows in each component..
func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int
    return bizCat.count


func pickerView(pickerView: UIPickerView!, titleForRow row: Int, forComponent component: Int) -> String! 
    return bizCat[row]


func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int)

    textfieldBizCat.text = "\(bizCat[row])"


【问题讨论】:

【参考方案1】:

如果我能很好地理解您的问题,您希望:

    有一个 UITextField 显示选定的文本 当用户点击UITextField时打开一个选择器 选择项目(在选择器中)时关闭选择器,并将其设置在UITextField

这是管理它的完整代码,你只需要链接你的UITextField的代表:

@IBOutlet var textfieldBizCat: UITextField!
@IBOutlet var pickerBizCat: UIPickerView! = UIPickerView()

var bizCat = ["Cat One", "Cat Two", "Cat Three"]


override func viewDidLoad() 
    super.viewDidLoad()
    pickerBizCat.hidden = true;
    textfieldBizCat.text = bizCat[0]


// returns the number of 'columns' to display.
func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int
    return 1


// returns the # of rows in each component..
func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int
    return bizCat.count


func pickerView(pickerView: UIPickerView!, titleForRow row: Int, forComponent component: Int) -> String! 
    return bizCat[row]


func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int)

    textfieldBizCat.text = bizCat[row]
    pickerBizCat.hidden = true;


func textFieldShouldBeginEditing(textField: UITextField) -> Bool 
    pickerBizCat.hidden = false
    return false

我对您的代码所做的更改:

使用UITextFieldDelegate 在选择UITextField 时显示选择器 选择项目后隐藏选择器,并设置UITextField 选择任何项目时,在UITextField 中设置选择器的第一行

【讨论】:

感谢您的帮助 Ckouta。它现在在文本字段中显示“Cat One”,但是当我单击它时,UIPicker 没有出现。 您是否从您的 xib 中设置了 UITextField 委托?您也可以通过编程方式完成,只需添加 textfieldBizCat.delegate = selfin viewDidLoad 哦,好的,忘记了。还需要将pickerBizCat.delegate = self 添加到viewDidLoad。现在它起作用了!非常感谢。 如果您有多个文本字段要在该视图中添加选择器,如何修改@Ckouta 那是另一个问题,我建议你直接用你的实际源代码在堆栈上提出一个新问题,问题...【参考方案2】:

在你的 didSelectRow 方法中你 resignFirstResponder 怎么样?

func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int)

textfieldBizCat.text = bizCat[row]
pickerBizCat.resignFirstResponder()

【讨论】:

【参考方案3】:

Swift 4 版本

override func viewDidLoad() 
    super.viewDidLoad()

    pickerView.dataSource = self
    pickerView.delegate = self

    textField.delegate = self
    textField.inputView = pickerView

还有扩展

// MARK: - UIPickerViewDelegate

extension ViewController: UITextFieldDelegate 

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool 
        pickerView.isHidden = false
        return false
    


// MARK: - UIPickerViewDelegate

extension ViewController: UIPickerViewDelegate, UIPickerViewDataSource 

    func numberOfComponents(in pickerView: UIPickerView) -> Int 
        return 1
    

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
        return myItems.count
    

    func pickerView( _ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 
        return myItems[row].name
    

    func pickerView( _ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
        textField.text = myItems[row].name
        pickerView.isHidden = true
    

【讨论】:

【参考方案4】:
  // pressing the button again would hide the uipickerview. when pressed the first time, update the button's label to "done" , "hide" or whatever suits u!
    @IBAction func propertyTypeButtonPressed(sender: UIButton)/* the name of your button's action*/
    
        count++; //declare it first
        ViewContainigPickerView.hidden = false
        self.view.endEditing(true)

        if (count == 2)
        
            ViewContainingPickerView.hidden = true /* if you placed your picker on a separate view for simplicity*/
            count = 0;

        

    

【讨论】:

以上是关于显示 UIPickerView 文本字段被选中,然后在选中后隐藏的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 UIPickerView 在一个视图中填充不同的文本字段?

UIPickerView 作为按钮操作并根据选择器的选定值设置文本字段的文本

在 AlertController 中从 UIPickerView 填充文本字段时出现问题

如何在一个视图中将一个 UIPickerView 用于多个文本字段?

UIPickerView:键盘不隐藏

UIPickerView 不会立即重绘未选中的行