如何在swift 4中正确使用选择器

Koh*_*yer 10 uidatepicker uiview ios swift swift4

我已经阅读了很多教程甚至是官方的Apple文档,并且不能理解这段代码有什么问题.

var dueDatePicker = UIDatePicker()

@IBOutlet weak var textField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    textField.inputView = dueDatePicker
    dueDatePicker.addTarget(self, action: #selector(datePickerValueChanged(_:)), for: UIControlEvents.valueChanged)
}

func datePickerValueChanged(_ sender: UIDatePicker){
    //Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

在运行时,我单击textField并显示UIDatePicker.执行选择器指向的功能.只要我点击UIDatePicker之外的UI对象,应用程序就会崩溃并显示以下错误:

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [YourApp.PromiseViewController dueDateChanged:]:无法识别的选择器发送到实例0x100b12ae0'

我不明白的是,最初识别"选择器"或指向所需功能的指针.但是,当我从另一个UI对象触发另一个事件时,抛出此异常.

为什么会这样?

datePickerValueChanged()最初调用时不应触发此异常吗?

Lea*_*eat 8

只需在功能前添加@objc即可

@objc func datePickerValueChanged(_ sender: UIDatePicker){
    //Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 抱歉!!我的意思是,你的解决方案是完美的!:)但是非常不幸的是,Swift目前以这种方式工作,不得不这样做是一种耻辱. (6认同)
  • 这是一个糟糕的解决方案! (2认同)

Jef*_*mas 5

该错误告诉您已将选择器的操作dueDateChanged(_:)添加为目标操作.

可以向控件添加多个目标操作.某处,也许在你的故事板或xib中,你还有另外一个动作dueDatePicker.