【问题标题】:UITextField not triggering action event upon UIDatePicker action eventUITextField 不会在 UIDatePicker 动作事件上触发动作事件
【发布时间】:2017-12-26 20:29:55
【问题描述】:

我有一个更新我的文本字段的 datePicker。一旦 textField 数据发生更改,就应该执行操作(例如验证数据)。问题是datePicker更新textField后,textField不执行任何动作,不管我在textField上使用什么动作事件,比如.ValueChanged。我无法弄清楚问题是什么。不过我注意到,如果我要在 textField 中输入内容,则操作事件会起作用。 这是我的代码:

class CustomTextField: UITextField, UITextFieldDelegate {

    var customDelegate : CustomTextFieldDelegate?

    enum type {
        case standard
        case date
    }

    var textFieldType : type = .standard {
        didSet{
            switch self.textFieldType {
            case .standard:
                break
            case .date:
                let datePicker = UIDatePicker.MMMddyyyy
                self.inputView = datePicker
                datePicker.addTarget(self, action: #selector(refreshOnDatePicker(_:)), for: .valueChanged)
                self.addTarget(self, action: #selector(checkFieldInput), for: .applicationReserved)
                break
            }
        }
    }


    @objc private func checkFieldInput(sender: CustomTextField){
        guard let fieldInput = self.text else { return }
        switch sender.textFieldType {
            case .standard:
                break
            case .date:
                customDelegate?.isTextFieldVerified = !fieldInput.isEmpty
            break
        }
    }

    @objc private func refreshOnDatePicker(_ selector: UIDatePicker){
        self.text = selector.date.formattedMMMMddyyyy
    }
}


fileprivate extension UIDatePicker {
    class var MMMddyyyy : UIDatePicker {
        let currentDate: NSDate = NSDate()



    let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!
    calendar.timeZone = NSTimeZone(name: "UTC")! as TimeZone

    let components: NSDateComponents = NSDateComponents()
    components.calendar = calendar as Calendar
    components.year = -100

    let minDate: NSDate = calendar.date(byAdding: components as DateComponents, to: currentDate as Date, options: NSCalendar.Options(rawValue: 0))! as NSDate

    let dp = UIDatePicker()
    dp.datePickerMode = .date
    dp.minimumDate = minDate as Date
    dp.maximumDate = currentDate as Date
    dp.backgroundColor = UIColor.white
    return dp
   }
}

fileprivate extension Date {
    /// date formatted type "MMMM dd, yyyy"
    var formattedMMMMddyyyy: String {
        let formatter = DateFormatter()
        formatter.dateFormat = "MMMM dd, yyyy"
        return  formatter.string(from: self)
    }
}

【问题讨论】:

  • 我想要实现的是一个带有 datePicker 键盘的 textField。选择日期后,textField 需要更新和验证条目。可能正在使用数据库验证条目
  • 好吧,然后我添加了 self.checkFieldInput(sender:self) 并删除了 self.addTarget(self, action: #selector(checkFieldInput), for: .editingChanged)

标签: ios swift uitextfield uidatepicker


【解决方案1】:

试试这个

 @objc private func refreshOnDatePicker(_ selector: UIDatePicker){
    self.text = selector.date.formattedMMMMddyyyy
    self.checkFieldInput(sender:self)
}

【讨论】:

  • 是的,所以 .ValueChanged 或 ".anything" 不起作用。确实“self.checkFieldInput(sender:self)”有效。但是我觉得这更像是一个黑客,不是吗?我的意思是它有效,但为什么 .ValueChanged 不起作用?我只是不明白。我应该如何正确构建它?
  • valueChanged 工作,当它触发它调用 refreshOnDatePicker 将为 textfeild 设置一个新文本并调用验证其内容的方法
  • 这种方法没有错,无论如何它都不是“黑客”。 UITextField 不会生成 .valueChanged 事件,因此您不能使用它。事实上,UITextField 的许多事件仅在通过键盘(虚拟或硬件)更改文本时触发,而不是在直接设置 .text 属性时触发。如果您真的想在 .text 更改时执行某些操作,请考虑覆盖 .text 属性并使用 didSet 属性观察器。
  • valueChanged 事件与选择器关联而不是 textFeild
  • @UpholderOfTruth 我喜欢你为帖子添加点睛之笔的方式,我想我们在 stackOverflow 会面很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
相关资源
最近更新 更多