【问题标题】:Open UIDatePicker when UITextField is tapped from Custom Component从自定义组件中点击 UITextField 时打开 UIDatePicker
【发布时间】:2017-08-28 19:07:00
【问题描述】:

我有一个自定义的UIView 组件,它有一个UITextFieldUIImageView 和另一个UIView

我需要更改UITextField 的行为以在点击时显示UIDatePicker。这是我正在尝试执行的代码,但由于某种原因,datePicker 在被点击时没有打开:

class TextFieldWithFeedback : UIView {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var underlineView: UIView!

    override func draw(_ rect: CGRect) {
        let datePicker = UIDatePicker()
        datePicker.datePickerMode = .date
        self.textField.inputView = datePicker
    }
}

当我在 ViewController(下面的代码)上使用相同的代码时,它起作用了:

override func viewDidLoad() {
    super.viewDidLoad()

    let datePicker = UIDatePicker()
    datePicker.datePickerMode = .date
    customView.textField.inputView = datePicker
}

现在,此解决方案有效,但并不理想,因为我有 8 个自定义视图,最好设置一次而不是 8 次。

我应该使用 View 类的哪个方法来设置 datePicker? 因为 draw 不起作用。

另外,当用户选择日期时,如何附加一个函数来修改我的UITextField 值?

【问题讨论】:

  • 您需要保留日期选择器的参考
  • 只需将其声明为视图控制器的属性
  • @LeoDabus 在 ViewController 上实例化 DatePicker 并将其设置在每个 customView 上?在draw方法上使用
  • 不要为此滥用draw!哦,恐怖,恐怖。
  • @matt 帮帮我,我应该使用哪一个:)

标签: swift swift3 uitextfield uikit uidatepicker


【解决方案1】:

设法像这样解决它:

//To control whether or not to use the DatePicker, easily customized on the Storyboard
@IBInspectable var useDatePicker: Bool = false

@IBAction func textFieldEditing(_ sender: UITextField) {
    self.textFieldStartedEditing(sender: sender)
}

func textFieldStartedEditing(sender: UITextField) {
    if useDatePicker {
        let datePickerView:UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = .date

        sender.inputView = datePickerView
        datePickerView.addTarget(self, action: #selector(self.datePickerValueChanged), for: UIControlEvents.valueChanged)
    }
}

func datePickerValueChanged(sender: UIDatePicker) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd/MM/YYYY"
    self.textField.text = dateFormatter.string(from: sender.date)
}

上面的所有代码都在我的 customView 类中。

如果其他人在这方面遇到问题并需要帮助,请随时发表评论,我保证我会比评论问题的人更有帮助:)

【讨论】:

    【解决方案2】:

    您需要做的是将目标添加到您的文本字段,然后在方法中显示 UIPickerView

    self.textField.addTarget(self, action: #selector(ViewController.openDatesPicker), for: .touchDown)
    

    您还应该为您的文本字段设置标签,以便稍后在代码中识别它。你也应该实现这个方法来阻止键盘出现

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        if textField.tag == 2 {
            return true
        } else {
            return false
        }
    }
    

    【讨论】:

    • 我的问题只解决了一半,最大的问题是 datePicker 打不开
    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多