解雇错误

时间:2017-12-12 05:53:34

标签: 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.
}

4 个答案:

答案 0 :(得分:0)

我认为你在这里遇到问题,

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

这里dueDateSelector是没有任何名为resignFirstResponder()的方法的按钮,这就是你收到错误的原因

相反,你可以这样做,

@objc func doneButton(sender:UIButton)
    {
        //remove or hide the input view
    }

您还可以使用

检查当前组件是否具有此方法
if dueDateSelector.canResignFirstResponder()
{
}

答案 1 :(得分:0)

您使用的是不推荐使用的字符串选择器语法:

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

应替换为:

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

它也适用于代码中的其他方法:

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

答案 2 :(得分:0)

doneButton.addTarget(self, action:#selector(self.doneButton(_:)) , for:
    UIControlEvents.touchUpInside) // set button click event
datePickerView.addTarget(self, action: #selector(self.handleDatePicker(_:)), for: UIControlEvents.valueChanged)

如果自己不能使用类引用,如yourClass()。doneButton

答案 3 :(得分:0)

这是由于Swift和Objective C之间的命名方法不一致。这也是您应该使用visited_at.apply(lambda x: pd.to_datetime(x[1:-1]) if len(x)>2 else x) 语法而不是使用字符串来编写选择器的原因。您需要更改此行:

0                     []
1                     []
2    2017-04-24 00:00:00
3                     []
4                     []

选择器是目标C的东西。如果用字符串编写它,那么你需要以Objective C方式编写它。在您的代码中,#selector实际上并未在Objective C中调用datePickerView.addTarget(self, action: Selector("handleDatePicker:"), for: UIControlEvents.valueChanged) 。它可能类似于handleDatePicker。这是因为你在那里有一个handleDatePicker:参数,这就成了Objective C眼中的handleDatePickerWithSender:部分。

这就是我们喜欢写这样的选择器的原因:

sender

无需担心参数,只需要担心方法名称。

WithSender

此外,此行也需要更改:

#selector(handleDatePicker)

应该是:

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