【问题标题】:Setting UITextField's inputView property to a UIPicker not working in Swift将 UITextField 的 inputView 属性设置为 UIPicker 在 Swift 中不起作用
【发布时间】:2026-02-04 21:00:02
【问题描述】:

您好,当用户单击文本字段时,我正在尝试以编程方式弹出 UIPickerView 视图。我已经尝试过了,但它什么也没做,它不起作用。单击文本字段时什么都没有发生

class UserProfileTableViewController: UITableViewController,UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource {
 var itemPicker: UIPickerView! = UIPickerView()
    
    @IBOutlet weak var genderTxtField: UITextField!
   
    
    var gender = ["MALE","FEMALE"]
    override func viewDidLoad() {
        super.viewDidLoad()
       
        genderTxtField.delegate = self
        
        itemPicker!.delegate = self
        itemPicker!.dataSource = self
        itemPicker!.backgroundColor = UIColor.blackColor()
    
        self.genderTxtField.inputView = itemPicker
    }
    
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{
        return 1
    }
    
    // returns the # of rows in each component..
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
        return gender.count
    }
    
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return gender[row]
    }
    
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
        genderTxtField.text = gender[row]
        //.hidden = true;
    }
    
    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
        itemPicker.hidden = false
        return false
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

【问题讨论】:

  • 只是为了确定,文本字段是否正确链接?您还应该在工具栏中添加一个包含选择按钮的工具。让用户体验更好
  • 如何添加工具栏?
  • 我需要写一个答案给你看
  • 好的,谢谢@Devster101
  • @Devster101 等待您的答复

标签: ios swift uipickerview uipickerviewdatasource


【解决方案1】:

您当前代码中的问题在于这种方法:

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    itemPicker.hidden = false 
    return false // <--- this is not letting the textField become editable
}

我建议完全删除此方法。

【讨论】:

  • 我不相信这个答案,我什至不认为这个方法应该在代码中。选择器应显示为输入视图。无需操纵它的隐藏属性
  • 我同意。这种方法毫无意义。但是,我更多地指出了错误所在。
  • @DavidWilliames ...是的,它现在可以工作了...谢谢你..我删除了这个方法
  • @hellosheikh 太好了。不用担心。请将此答案标记为解决方案
【解决方案2】:

好的,所以我挖出了我写的类似的东西,它使用日期选择器,但一般代码是相同的。

var datePicker: UIDatePicker!
@IBOutlet var dateFrom: UITextField!

override func viewDidLoad() {
   super.viewDidLoad()
   self.setUpDatePicker()
}

func setUpDatePicker() {
        datePicker.datePickerMode = UIDatePickerMode.Date
        let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 0, height: 44))
        let doneBtn = UIBarButtonItem(title: "Select", style: UIBarButtonItemStyle.Done, target: self, action: "selectDate")
        let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)

        toolBar.setItems([space, doneBtn], animated: false)

        YOURTEXTFIELD.inputAccessoryView = toolBar
        YOURTEXTFIELD.inputView = datePicker             
    }

然后你添加一个函数来处理完成按钮按下

func selectDate() {
        let formatter = NSDateFormatter()
        formatter.dateFormat = "dd-MM-yyyy";

        YOURTEXTFIELD.text = formatter.stringFromDate(datePicker.date)
        YOURTEXTFIELD.resignFirstResponder()
    }

只需将 YOURTEXTFIELD 替换为您的版本 genderTxtField 并将日期选择器更改为您的选择器。

不要忘记检查所有内容是否已链接

【讨论】:

  • 不用担心,编码愉快
【解决方案3】:
itemPicker!.backgroundColor = UIColor.blackColor() 

改成

 itemPicker!.backgroundColor = UIColor.whiteColor()

然后删除

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    itemPicker.hidden = false
    return false
}

祝你好运!

【讨论】:

    【解决方案4】:
    func textFieldShouldBeginEditing(textField: UITextField) -> Bool 
    {
        itemPicker.hidden = false 
        return true
    }
    

    您只需将 func textFieldShouldBeginEditing 中的 false 更改为 true。

    【讨论】: