2016-12-07 49 views
0

在我的应用程序中,我有一个用于添加出生日期的文本框。我添加一个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. 
    } 



} 

我控制台输出为:

无法识别的选择发送到实例为0x7终止应用程序由于未捕获的异常 'NSInvalidArgumentException',原因是:“ - [BController getCalendar:]:无法识别的选择器发送到实例0x78789050'

如何解决此问题?我正在使用Xcode 6.2。如果您需要更多信息,请告诉我。

+0

请向我们展示getCalendar函数中的代码 – Asike

+0

@Asike我没有一个名为getCalendar的方法。我是iSO开发的新手,我跟着这个过程的教程。我也看不到任何名为getCalendar的方法。我不知道这个错误是从哪里引用的。 –

回答

0

由于文档说:

VAR inputView:UIView的? 当文本字段成为第一响应者时显示的自定义输入视图。

所以,你应该首先初始化你的日期选择器,然后将其分配到viewDidLoad方法,而不是textFieldDidBeginEditing法出生日期的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