2017-02-14 3 views
0

У меня есть UITextField, который может вводить дату, используя сборщик данных, а также с цифровой клавиатурой. Когда пользователь обращается непосредственно к UITextField, открывается открытая цифровая клавиатура, но когда пользователь нажимает на UIButton DatePicker, должен открываться.Использование двух входных представлений для одного и того же UITextField

Мой код:

userInfo.addTarget(self, action: #selector(textFieldEditing), for: .editingDidBegin) 
func textFieldEditing(sender: UITextField) { 
     sender.inputView = nil 
     sender.inputAccessoryView = nil 
     sender.reloadInputViews() 
} 
func pickUpDate(){ 

     // DatePicker 
     datePicker = UIDatePicker() 
     datePicker.backgroundColor = UIColor.white 
     datePicker.setValue(Constants.Colors.AppGreen, forKey: "textColor") 
     datePicker.datePickerMode = UIDatePickerMode.date 
     datePicker.addTarget(self, action: #selector(datePickerValueChanged), for: UIControlEvents.valueChanged) 

     let gregorian: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)! 
     let currentDate: Date = Date() 
     let components: NSDateComponents = NSDateComponents() 


     if txtFDOB.textFieldType == UserBasicDetailCellType.UserBasicDetailCellDOBType { 
      components.year = -18 
      let minDate: Date = gregorian.date(byAdding: components as DateComponents, to: currentDate as Date, options: NSCalendar.Options(rawValue: 0))! 

      components.year = -150 
      let maxDate: Date = gregorian.date(byAdding: components as DateComponents, to: currentDate as Date, options: NSCalendar.Options(rawValue: 0))! 
      datePicker.maximumDate = minDate 
      datePicker.minimumDate = maxDate 

      datePicker.date = minDate 
     } 
     if txtFDOB.textFieldType == UserBasicDetailCellType.UserBasicDetailCellNomineeDOBType { 
      components.year = -18 
      let minDate: Date = gregorian.date(byAdding: components as DateComponents, to: currentDate as Date, options: NSCalendar.Options(rawValue: 0))! 
      datePicker.minimumDate = minDate 
      datePicker.maximumDate = currentDate 
     } 

     // ToolBar 
     let toolBar = UIToolbar() 
     toolBar.barStyle = .default 
     toolBar.isTranslucent = true 
     toolBar.tintColor = Constants.Colors.DarkGrey 
     toolBar.sizeToFit() 

     // Adding Button ToolBar 
     let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(KycFormViewController.doneClick)) 
     doneButton.setTitleTextAttributes([NSFontAttributeName : UIFont.systemFont(ofSize: 18.0),NSForegroundColorAttributeName : Constants.Colors.AppGreen,NSBackgroundColorAttributeName:Constants.Colors.LightGrey],for: UIControlState.normal) 

     let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) 
     let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(KycFormViewController.cancelClick)) 
     cancelButton.setTitleTextAttributes([NSFontAttributeName : UIFont.systemFont(ofSize: 18.0),NSForegroundColorAttributeName : Constants.Colors.AppGreen,NSBackgroundColorAttributeName:UIColor.black], 
              for: UIControlState.normal) 
     toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) 
     toolBar.isUserInteractionEnabled = true 


     txtFDOB.resignFirstResponder() 
     DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 
      self.txtFDOB.inputAccessoryView = toolBar 
      self.txtFDOB.inputView = self.datePicker 
      self.txtFDOB.becomeFirstResponder() 
     }   
    } 

Теперь, когда я resignFirstResponder() и сделать FirstResponder снова textFieldEditing дозвонились и установить InputViews к нулю.

Любой другой способ реализовать то же самое.

Заранее спасибо

+0

этот не ясно, вы можете elobate 'OW Когда я resignFirstResponder() и make FirstResponder снова textFieldEditing вызывается и устанавливает InputViews на nil.' –

+0

Когда метод DatePicker вызывает в конце, я делаю это txtFDOB.resignFirstResponder() DispatchQueue.main.asyncAfter (крайний срок: .now() + 0.1) { self.txtFDOB.inputAccessoryView = self.txtFDOB.inputView ПАНЕЛИ ИНСТРУМЕНТОВ = self.datePicker self.txtFDOB.becomeFirstResponder() } После чего мой textFeildEditing метод дозвонились, который устанавливает inputview к нулю – Haroon

+0

, что цель у дона это –

ответ

1

сделать, как

шаг-1

удалить следующий код внутри methof func pickUpDate()

txtFDOB.resignFirstResponder() 
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 
     self.txtFDOB.inputAccessoryView = toolBar 
     self.txtFDOB.inputView = self.datePicker 
     self.txtFDOB.becomeFirstResponder() 
    }  

шаг 2

call/Move your `func pickUpDate()` to `viewdidload` 

шаг-3

ваш TextField func textFieldEditing(sender: UITextField) правильно, так же, как это делают в вашей кнопки также, как этот

func datePickerClicked(sender: UIButton!) { 
txtFDOB.resignFirstResponder() 
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 
self.txtFDOB.inputAccessoryView = toolBar 
self.txtFDOB.inputView = self.datePicker 
self.txtFDOB.becomeFirstResponder() 
} 
} 
Смежные вопросы