2016-12-07 13 views
0

私のアプリケーションでは、生年月日を追加するテキストフィールドがあります。ユーザーがテキストフィールドをタップすると、popupにdatePickerを追加します。 datePickerは正しく表示され、ユーザーがテキストフィールドに表示している日付を選択した後に表示されます。問題は、datePickerが終了していない日付を選択した後です。DatePickerが外にタップした後に閉じない

これは私のコードです:

class BController: UIViewController, UITextFieldDelegate { 

@IBOutlet weak var dateOfBirth: UITextField! 

    let datePicker = UIDatePicker() 




    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     // self.view.endEditing(true) 
     return true 
    } 



    func textFieldDidBeginEditing(textField: UITextField){ 
     if textField == dateOfBirth{ 
      // let datePicker = UIDatePicker() 

      datePicker.datePickerMode = UIDatePickerMode.Date 

      datePicker.backgroundColor = UIColor.blackColor() 
      datePicker.setValue(UIColor.whiteColor(), forKey: "textColor") 

      textField.inputView = datePicker 
      datePicker.addTarget(self, action: "datePickerChanged:", forControlEvents: .ValueChanged) 
     } 
    } 

    func datePickerChanged(sender: UIDatePicker){ 

     let formatter = NSDateFormatter() 
     formatter.dateFormat = "dd-MM-yyyy" 
     // formatter.dateStyle = .ShortStyle 
     // formatter.timeStyle = .NoStyle 
     dateOfBirth.text = formatter.stringFromDate(sender.date) 

    } 

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     print("touch happened") 
     self.view.endEditing(true) 

    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     dateOfBirth.delegate = self 
     text1.delegate = self 
     text2.delegate = self 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 



} 

として、私はコンソール出力を得た:認識されていないセレクタがキャッチされない例外が原因アプリ 'NSInvalidArgumentException'、理由の終了インスタンスを0x7に送ら

:「 - [BController getCalendar:]:インスタンスに送信された認識できないセレクタ0x78789050 '

この問題を解決するにはどうすればよいですか?私はXcode 6.2を使用しています。より多くの情報が必要な場合は、私に知らせてください。ドキュメントとして

+0

getCalendar関数でコードを表示してください – Asike

+0

@私はgetCalendarというメソッドはありません。私はiSOの開発が初めてで、このプロセスのチュートリアルに従いました。そこにはgetCalendarというメソッドもありません。私はこのエラー参照がどこからわかるのかわかりません。 –

答えて

0

は言う:

のvar inputView:UIViewの? テキストフィールドが最初のレスポンダになったときに表示するカスタム入力ビュー。

したがって、まずdatePickerを初期化し、textFieldDidBeginEditingメソッドの代わりにviewDidLoadメソッドのdateOfBirthのinputViewプロパティに割り当てます。あなたの間違いはUITapGestureRecognizerがself.viewに

class ViewController: UIViewController { 

    @IBOutlet weak var textField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let datePicker = UIDatePicker.init() 
     textField.inputView = datePicker 

     let gestureRecognizer = UITapGestureRecognizer.init(target: self, action: #selector(backgroundTap(gesture:))); 
     view.addGestureRecognizer(gestureRecognizer) 

    } 

    func backgroundTap(gesture : UITapGestureRecognizer) { 
     textField.resignFirstResponder() // or view.endEditing(true) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

を追加使用外のタップに日付ピッカーを閉じるための

は、メソッド呼び出しをtextFieldDidBeginEditingとき、UITextFieldのはUIDatePickerについて何も知らないということです。

+0

ありがとうございます。私はこれを試しましたが、同じ結果と同じ例外が発生しています。何か案は? –

+0

私は自分の答えを更新しました。 – Asike

関連する問題