【问题标题】:How to properly use selectors in swift 4如何在 swift 4 中正确使用选择器
【发布时间】:2017-06-22 01:41:47
【问题描述】:

我已经阅读了很多教程,甚至苹果官方文档,一定不明白这段代码有什么问题。

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 对象,应用程序就会崩溃并出现以下错误:

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

我不明白的是,最初识别出“选择器”或指向所需函数的指针。但是,当我从另一个 UI 对象触发另一个事件时,会引发此异常。

为什么会这样?

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

【问题讨论】:

    标签: ios swift uiview uidatepicker swift4


    【解决方案1】:

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

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

    【讨论】:

    • 这是一个糟糕的解决方案!
    • 你的想法怎么样@Fattie
    • 对不起!!我的意思是,你的解决方案是完美的!!! :) 但是很遗憾 Swift 目前是这样工作的,不得不这样做是一种耻辱。
    【解决方案2】:

    错误是告诉您带有选择器dueDateChanged(_:) 的操作已添加为目标操作。

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

    【讨论】:

    • 我不敢相信我没有看到。非常感谢。我开始怀疑我存在的逻辑。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多