2017-12-13 23 views
1

キーボードの日付ピッカー表示が必要です。私はUITextField拡張を使用してこれをやっています。Swiftのテキストフィールドに日付を表​​示するには、日付ピッカー(または日付のみ)を渡すにはどうすればよいですか?

マイコード:

extension UITextField { 

//... other functions 

func showDatePicker(){ 
    let datePicker = UIDatePicker() 
    datePicker.datePickerMode = .date 

    let toolbar = UIToolbar(); 
    toolbar.sizeToFit() 

    let doneButton = UIBarButtonItem(title: "Pronto", style: UIBarButtonItemStyle.plain, target: self, action: #selector(UITextField.doneDatePicker(_:))) 
    let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil) 
    let cancelButton = UIBarButtonItem(title: "Cancelar", style: UIBarButtonItemStyle.plain, target: self, action: #selector(UITextField.donePicker)) 
    toolbar.setItems([cancelButton,spaceButton,doneButton], animated: false) 

    self.inputAccessoryView = toolbar 

    self.inputView = datePicker 

} 

@objc func doneDatePicker(_ datePicker: UIDatePicker){ 

    let formatter = DateFormatter() 
    formatter.dateFormat = "dd/MM/yyyy" 
    self.text = formatter.string(from: datePicker.date) 
    self.endEditing(true) 
} 
} 

私の問題は、私は「プロント」ボタンとdoneDatePickerが実行される機能をタップしたときです。私は、テキストフィールドに日付を表​​示するUIDatePicker(または単に日付)を渡す必要があるが、私はこのエラーを取得:

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

どのように私はこの問題を解決することができますか?

答えて

0

あなたは単にのUITextFieldのサブクラスを作成し、あなたのUITextFieldのプロパティとしてあなたの日付ピッカーを宣言し、didMoveToSuperviewメソッドをオーバーライドして、そこにカスタマイズを行う必要があります。

class DateField: UITextField { 
    var date: Date? 
    let datePicker = UIDatePicker() 
    let formatter = DateFormatter() 
    override func didMoveToSuperview() { 
     datePicker.datePickerMode = .date 
     formatter.dateStyle = .short 
     let toolbar = UIToolbar() 
     toolbar.sizeToFit() 
     let done = UIBarButtonItem(title: "Pronto", style: .plain, target: self, action: #selector(doneAction)) 
     let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) 
     let cancel = UIBarButtonItem(title: "Cancelar", style: .plain, target: self, action: #selector(cancelAction)) 
     toolbar.setItems([cancel,space,done], animated: false) 
     inputAccessoryView = toolbar 
     inputView = datePicker 
    } 
    @objc func cancelAction(_ sender: UIBarButtonItem) { 
     endEditing(true) 
    } 
    @objc func doneAction(_ sender: UIBarButtonItem) { 
     date = datePicker.date 
     text = formatter.string(from: datePicker.date) 
     endEditing(true) 
    } 
} 
+1

リンクされた質問は重複していました。 OPはターゲット/アクションセレクタを指定する方法を守りました – vadian

+0

はい、解決策はリンクされた質問にありませんでした –

0

セレクタで余分なパラメータを渡すことはできません。なぜあなたは

@objc func doneDatePicker(_ datePicker: UIDatePicker) 

に日付ピッカーを渡している

var datePicker: UIDatePicker! 

let datePicker = UIDatePicker() 

を交換し、シングルトンクラスの共有インスタンスとしてそれを置きます。 次に、関数内でdatePickerにアクセスします。

+0

しかし、私は、UITextFieldの拡張子を使用して、これをやっているし、私はできません拡張には格納されたプロパティが含まれない可能性があるため、変数globalを宣言します。どんな提案? –

+0

showDatePicker()関数を呼び出す場所はどこですか? –

+0

私は、VCでtextField.showDatePicker()を使用して呼び出しています。 –

関連する問題