【发布时间】:2017-07-02 09:53:23
【问题描述】:
我有一个 UITextField,它可以使用数据选择器和数字键盘输入日期,当用户直接点击 UITextField 数字键盘应该打开,但是当用户点击 UIButton DatePicker 应该打开。
我的代码:
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 设置为 nil 时。
任何其他实现相同的方式。
提前致谢
【问题讨论】:
-
这个不清楚可以发
ow When I resignFirstResponder() and make FirstResponder again textFieldEditing get called and set InputViews to nil. -
当 DatePicker 方法调用结束时我这样做 txtFDOB.resignFirstResponder() DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.txtFDOB.inputAccessoryView = toolBar self.txtFDOB. inputView = self.datePicker self.txtFDOB.becomeFirstResponder() } 之后我的 textFeildEditing 方法被调用,它将 inputview 设置为 nil
-
你这样做的目的是什么
-
放弃数字键盘并获取日期选择器作为输入视图
-
我部分理解当第一个进程结束时你想再次显示日期选择器作为输入视图,正确
标签: ios iphone swift keyboard uitextfield