2017-09-13 2 views
1

Ich lerne iOS-Entwicklung auf Xcode 8.3.3 und iOS 10.3 mit Swift 3. Ich versuche, ein Kontoerstellungsformular mit einem Feld zu erstellen, das zeigt ein UIDatePicker, wenn der Benutzer ein auf touchup am Tag der Geburt UITextField führt:'- [UITextField date]: unerkannter Selektor gesendet an Instanz 0x7f89277121c0'

@IBAction func showDatePicker(_ sender: UITextField) { 
    let datePicker = UIDatePicker() 
    datePicker.datePickerMode = UIDatePickerMode.date 
    datePicker.maximumDate = Calendar.current.date(byAdding: .year, value: -16, to: Date()) 
    dateOfBirth.inputView = datePicker 
    datePicker.addTarget(self, action: #selector(self.datePickerValueChanged), for: UIControlEvents.valueChanged) 
} 

@objc func datePickerValueChanged(_ picker: UIDatePicker) { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = DateFormatter.Style.medium 
    dateFormatter.timeStyle = DateFormatter.Style.none 
    dateOfBirth.text = dateFormatter.string(from: picker.date) 
} 

wenn ich die oben ausführen, ich den Fehler:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITextField date]: unrecognized selector sent to instance 0x7f89277121c0' 

für mich sieht es aus wie seine zu injizieren versucht der UITextField 'sender' Wert in das datePickerValueChanged Feld, welches t sein soll ake einen Wert vom Typ UIDatePicker, wodurch der Fehler verursacht wird. Ich habe versucht, es zu ändern, wo ich die Datepicker Objekt an die datePickerValueChanged Methode explizit übergeben:

 datePicker.addTarget(self, action: #selector(self.datePickerValueChanged(datePicker)), for: UIControlEvents.valueChanged) 

aber Xcode gibt mir dann einen Fehler:

Argument of '#selector' does not refer to an '@objc' method, property, or initializer 

Meine Funktion die @objc vor ihm hat Ich bin verwirrt, warum es das nicht erlaubt.

Also, meine letzte Frage ist: Wie kann ich sicherstellen, dass der Wert auf datePickerValueChanged bestanden vom Typ UIDatePicker ist, das heißt, das picker Objekt?

+0

Haben Sie versucht, die Reinigung oder das Projekt Wiederaufbau? – QPDev

+0

Tritt dieser Fehler auf, wenn die Datumsauswahl zum ersten Mal erscheint oder wenn Sie ein Datum in der Auswahl auswählen? –

+0

Ich habe versucht zu reinigen, aber es schlägt immer noch fehl. Dies geschieht auch, bevor die Datumsauswahl angezeigt wird. – user1011376

Antwort

0

Eigentlich habe ich gerade ein Testprojekt erstellt, und Ihr Code funktioniert gut (siehe unten). Sind Sie sicher, dass die Funktion datePickerValueChanged in derselben Klasse ist? CreateAnAccountPage?

class ViewController: UIViewController, UITextFieldDelegate { 
var dateOfBirth:UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    dateOfBirth = UITextField(frame: CGRect(x: 0, y: 300, width: 150, height: 75)) 
    dateOfBirth.borderStyle = .line 
    view.addSubview(dateOfBirth) 
    self.showDatePicker(dateOfBirth) 
    // Do any additional setup after loading the view, typically from a nib. 
} 

func showDatePicker(_ sender: UITextField) { 
    let datePicker = UIDatePicker() 
    datePicker.datePickerMode = UIDatePickerMode.date 
    datePicker.maximumDate = Calendar.current.date(byAdding: .year, value: -16, to: Date()) 
    dateOfBirth.inputView = datePicker 
    datePicker.addTarget(self, action: #selector(self.datePickerValueChanged), for: UIControlEvents.valueChanged) 
    view.addSubview(datePicker) 
} 

@objc func datePickerValueChanged(_ picker: UIDatePicker) { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = DateFormatter.Style.medium 
    dateFormatter.timeStyle = DateFormatter.Style.none 
    dateOfBirth.text = dateFormatter.string(from: picker.date) 
} 
} 
+0

Und das Original '#selector (self.datePickerValueChanged)' ist auch in Ordnung. Diese Antwort ändert nichts. – rmaddy

+0

Wenn ich versuche, gibt es mir den folgenden Fehler: Geben Sie 'CreateAnAccountPage' hat kein Mitglied 'datePickerValueChanged (Picker :)' – user1011376

-1

Versuch: -

datePicker.addTarget(self, action: #selector(YourViewController.datePickerValueChanged), for: UIControlEvents.valueChanged) 
+0

Ich habe das versucht, aber es gab mir den gleichen Fehler. – user1011376

Verwandte Themen