【问题标题】:Show UIPickerView text field is selected, then hide after selected显示 UIPickerView 文本字段被选中,然后在选中后隐藏
【发布时间】: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])"

}

【问题讨论】:

    标签: ios swift uipickerview


    【解决方案1】:

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

    1. 有一个 UITextField 显示选定的文本
    2. 当用户点击UITextField时打开一个选择器
    3. 选择项目(在选择器中)时关闭选择器,并将其设置在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;
        
                }
        
            }
        

        【讨论】:

          猜你喜欢
          • 2016-07-06
          • 1970-01-01
          • 2019-01-30
          • 2019-10-19
          • 1970-01-01
          • 2013-06-25
          • 2016-09-06
          • 1970-01-01
          • 2021-12-03
          相关资源
          最近更新 更多