【问题标题】:'-[UITextField date]: unrecognized selector sent to instance 0x7f89277121c0''-[UITextField date]: 无法识别的选择器发送到实例 0x7f89277121c0'
【发布时间】:2017-09-15 08:37:10
【问题描述】:

我正在使用 Swift 3 在 Xcode 8.3.3 和 iOS 10.3 上学习 iOS 开发。我正在尝试创建一个帐户创建表单,其中包含一个字段,当用户在出生日期执行润色时显示 UIDatePicker UITextField:

    @IBAction func showDatePicker(_ sender: UITextField) {
    let datePicker = UIDatePicker()
    datePicker.datePickerMode = UIDatePickerMode.date
    datePicker.maximumDate = Calendar.current.date(byAdding: .year, value: -16, to: Date())
    dateOfBirth.inputView = datePicker
    datePicker.addTarget(self, action: #selector(self.datePickerValueChanged), for: UIControlEvents.valueChanged)
}

@objc func datePickerValueChanged(_ picker: UIDatePicker) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = DateFormatter.Style.medium
    dateFormatter.timeStyle = DateFormatter.Style.none
    dateOfBirth.text = dateFormatter.string(from: picker.date)
}

当我执行上述操作时,我得到了错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITextField date]: unrecognized selector sent to instance 0x7f89277121c0'

在我看来,它似乎试图将 UITextField 'sender' 值注入到 datePickerValueChanged 字段中,该字段应该采用 UIDatePicker 类型的值,从而导致错误。我尝试将其更改为我将 datePicker 对象显式传递给 datePickerValueChanged 方法的位置:

        datePicker.addTarget(self, action: #selector(self.datePickerValueChanged(datePicker)), for: UIControlEvents.valueChanged)

但是 Xcode 然后给了我一个错误:

Argument of '#selector' does not refer to an '@objc' method, property, or initializer

我的函数前面有@objc,所以我很困惑为什么它不允许这样做。

所以,我的终极问题是:如何确保传递给 datePickerValueChanged 的​​值是 UIDatePicker 类型,即 datePicker 对象?

【问题讨论】:

  • 您是否尝试过清理或重建项目?
  • 日期选择器首次出现时是否会出现此错误,或者您在选择器中选择日期时是否会出现此错误?
  • 我尝试清洁,但仍然失败。此外,这发生在日期选择器甚至显示之前。

标签: ios swift xcode


【解决方案1】:

实际上,我刚刚构建了一个测试项目,您的代码运行良好(见下文)。你确定函数 datePickerValueChanged 在同一个类中吗? CreateAnAccountPage?

class ViewController: UIViewController, UITextFieldDelegate {
var dateOfBirth:UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    dateOfBirth = UITextField(frame: CGRect(x: 0, y: 300, width: 150, height: 75))
    dateOfBirth.borderStyle  = .line
    view.addSubview(dateOfBirth)
    self.showDatePicker(dateOfBirth)
    // Do any additional setup after loading the view, typically from a nib.
}

 func showDatePicker(_ sender: UITextField) {
    let datePicker = UIDatePicker()
    datePicker.datePickerMode = UIDatePickerMode.date
    datePicker.maximumDate = Calendar.current.date(byAdding: .year, value: -16, to: Date())
    dateOfBirth.inputView = datePicker
    datePicker.addTarget(self, action: #selector(self.datePickerValueChanged), for: UIControlEvents.valueChanged)
    view.addSubview(datePicker)
}

@objc func datePickerValueChanged(_ picker: UIDatePicker) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = DateFormatter.Style.medium
    dateFormatter.timeStyle = DateFormatter.Style.none
    dateOfBirth.text = dateFormatter.string(from: picker.date)
}
}

【讨论】:

  • 原来的#selector(self.datePickerValueChanged)也不错。这个答案不会改变任何事情。
  • 当我尝试它给我以下错误:Type 'CreateAnAccountPage' has no member 'datePickerValueChanged(picker:)'
【解决方案2】:

尝试:-

datePicker.addTarget(self, action: #selector(YourViewController.datePickerValueChanged), for: UIControlEvents.valueChanged)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2012-07-24
    相关资源
    最近更新 更多