Mr Ice
Mr Ice

Reputation: 690

Argument of '#selector' does not refer

Anyone can help me?

This is my code:

fileprivate func datapicker(sender : UITextField){

    let datePickerView:UIDatePicker = UIDatePicker()

    datePickerView.datePickerMode = UIDatePickerMode.date

    sender.inputView = datePickerView

    datePickerView.addTarget(self, action: #selector(datePickerValueChanged(sender: datePickerView, myText: sender)), for: UIControlEvents.valueChanged)

}

@objc func datePickerValueChanged(sender:UIDatePicker , myText : UITextField) {

    let dateFormatter = DateFormatter()

    dateFormatter.dateStyle = DateFormatter.Style.medium

    dateFormatter.timeStyle = DateFormatter.Style.none

    myText.text = dateFormatter.string(from: sender.date)
}

@IBAction func fromdateAction(_ sender: UITextField) {
    datapicker(sender: sender)

}

Upvotes: 1

Views: 2904

Answers (1)

Sweeper
Sweeper

Reputation: 270790

Selectors can't be called like that. You don't get to pass the arguments for a selector, the API does.

You have to pass in:

#selector(datePickerValueChanged)

This means that your datePickerValueChanged method can't take 2 arguments, because the API expects only one.

This means that you need a way to know which text field's date picker changed. One simple way to do this is to create a property called focusedTextField:

var focusedTextField: UITextField!

Set this to sender in your dataPicker method:

focusedTextField = sender

And set it to nil when the user ends editing

// in another method that is called when the text field ends editing
focusedTextField = nil

Now, you can remove the second argument from datePickerValueChanged and use focusedTextField instead.

Upvotes: 1

Related Questions