ios - 解雇错误

标签 ios swift

我有一个设置,可以在单击按钮时调出一个日期选择器。我有两个函数可以在选择日期时更改按钮的值。此外,我还有一个功能可以在我按下完成按钮时帮助关闭日期选择器。但是,我继续收到一条错误消息,指出“无法识别的选择器已发送至实例”。知道我可能做错了什么

 @IBOutlet weak var dueDateSelector: UIButton!
 @IBOutlet weak var myPickerView: UIPickerView!

@IBAction func changeDueDate(_ sender: Any) {
    //Create the view
    let inputView = UIView(frame: CGRect(x:0, y:420, width: self.view.frame.width, height: 240))
    var datePickerView  : UIDatePicker = UIDatePicker(frame: CGRect(x:0, y:40, width:0, height:0))
    datePickerView.datePickerMode = UIDatePickerMode.date
    inputView.addSubview(datePickerView) // add date picker to UIView
    let doneButton = UIButton(frame: CGRect(x:270, y:0, width:100, height:50))
    doneButton.setTitle("Done", for: UIControlState.normal)
    doneButton.setTitle("Done", for: UIControlState.highlighted)
    doneButton.setTitleColor(UIColor.black, for: UIControlState.normal)
    doneButton.setTitleColor(UIColor.gray, for: UIControlState.highlighted)
    inputView.addSubview(doneButton) // add Button to UIView
    doneButton.addTarget(self, action: "doneButton:", for: UIControlEvents.touchUpInside) // set button click event
    datePickerView.addTarget(self, action: Selector("handleDatePicker:"), for: UIControlEvents.valueChanged)
    view.addSubview(inputView)
    handleDatePicker(sender: datePickerView) // Set the date on start.

}

  @objc func handleDatePicker(sender: UIDatePicker) {
    let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
    dueDateSelector.setTitle(dateFormatter.string(from: sender.date), for: .normal)
}

@objc func doneButton(sender:UIButton)
{
    dueDateSelector.resignFirstResponder() // To resign the inputView on clicking done.
}

最佳答案

这是由于 Swift 和 Objective C 的命名方法不一致造成的。这也是为什么您应该使用 #selector 语法而不是使用字符串来编写选择器的原因。您需要更改此行:

datePickerView.addTarget(self, action: Selector("handleDatePicker:"), for: UIControlEvents.valueChanged)

选择器是 Objective C 的东西。如果你用字符串来写,那么你需要用 Objective C 的方式来写。在您的代码中,handleDatePicker 实际上并未在 Objective C 中称为 handleDatePicker:。它可能类似于 handleDatePickerWithSender:。这是因为那里有一个 sender 参数,在 Objective C 的眼中它变成了 WithSender 部分。

这就是为什么我们喜欢这样写选择器:

#selector(handleDatePicker)

不用担心参数,只需要方法名。

datePickerView.addTarget(self, action: #selector(handleDatePicker), for: UIControlEvents.valueChanged)

此外,这一行也需要更改:

doneButton.addTarget(self, action: "doneButton:", for: UIControlEvents.touchUpInside)

应该是:

doneButton.addTarget(self, action: #selector(doneButton), for: UIControlEvents.touchUpInside)

关于ios - 解雇错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47766120/

相关文章:

ios - XCode 4.2 story builder 的 "Defines Context"和 "Provide Context"是什么意思?

ios - iOS 上的多个 PushNotifications

ios - 尝试使用 Parse 显示查询的用户信息

ios - 获取嵌入到 CollectionView 中的 TableView 中的 IndexPath 项

ios - 带有复选框的 UITextView

ios - multiplyByInverseOfAttitude(CMAttitude类)是如何实现的?

ios - 使用 stringByReplacingOccurrencesOfString 来考虑 "words"

swift - 尝试保存用户信息以使用 swift 解析替代 Syncano

swift - Swift 中 UITextView 文本的结尾

ios - 从不是 View Controller 的类导航到 View Controller