2017-06-22 82 views
7

我已经阅读了许多教程,甚至是官方的Apple文档,并且不知道这段代码有什么问题。如何在swift中正确使用选择器4

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 
} 

在运行时,我单击textField并出现UIDatePicker。选择器指向的函数被执行。虽然我点击的UIDatePicker之外的UI对象很快,应用程序崩溃,与此错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[YourApp.PromiseViewController dueDateChanged:]: unrecognized selector sent to instance 0x100b12ae0'

我不明白的是,“选择”或指针所需要的功能初始确认。但是,当我从另一个UI对象触发另一个事件时,会引发此异常。

这是怎么发生的?

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

回答

5

错误提示您已将选择器dueDateChanged(_:)的操作添加为目标操作。

可以向控件添加多个目标操作。在某个地方,也许在您的故事板或xib中,您有另一个动作添加到dueDatePicker

+0

我不能相信我没有看到这一点。非常感谢。我开始怀疑我存在的逻辑。干杯! –

6

只需添加@objc在你的函数的前

@objc func datePickerValueChanged(_ sender: UIDatePicker){ 
    //Do Stuff 
} 
+0

这是一个吸吮解决方案! – Fattie

+0

你的想法如何?Fattie –

+2

对不起!我的意思是,你的解决方案是完美的! :)但很不幸的是,Swift现在以这种方式工作,这是不得已而为之的。 – Fattie