2017-09-13 25 views
1

我用斯威夫特3.我試圖創建一個領域,顯示了一個帳戶創建形式學習上的Xcode 8.3.3和iOS 10.3 iOS開發當用戶上誕生的UITextField的日期觸上執行一個的UIDatePicker:「 - [最新的UITextField]:無法識別的選擇發送到實例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) 
} 

當我執行上面的,我得到的錯誤:

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

對我來說,它看起來像它試圖注入將UITextField的「發送者」值放入datePickerValueChanged字段中,該字段應該是t ake類型UIDatePicker的值,從而導致錯誤。我試圖將其更改爲我明確地傳遞的日期選擇對象的datePickerValueChanged方法:

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

但隨後的Xcode給了我一個錯誤:

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

我的函數在它前面的@objc ,所以我很困惑爲什麼它不允許。

所以,我最終的問題是:如何確保傳遞給datePickerValueChanged值類型的UIDatePicker,即日期選擇器對象?

+0

您是否嘗試過清理或重建項目? – QPDev

+0

當日期選取器第一次出現或在選取器中選擇日期時,是否發生此錯誤? –

+0

我試過清洗,但仍然失敗。此外,這發生在日期選擇器甚至顯示之前。 – user1011376

回答

0

其實,我剛剛建立了一個測試項目,你的代碼是工作的罰款(見下文)。你確定datePickerValueChanged函數在同一個類中嗎? 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

原來的'#selector(self.datePickerValueChanged)'也沒問題。這個答案不會改變任何東西。 – rmaddy

+0

當我嘗試它給了我以下錯誤:類型'CreateAnAccountPage'沒有成員'datePickerValueChanged(picker :)' – user1011376

-1

嘗試: -

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

我試過這個,但它給了我同樣的錯誤。 – user1011376

相關問題