ios - 对同一个 UITextField 使用两个输入 View

标签 ios iphone swift keyboard uitextfield

我有一个 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 时。

实现相同的任何其他方式。

提前致谢

最佳答案

喜欢

第一步

删除方法 func pickUpDate() 中的以下代码

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

第二步

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

第三步

你的文本字段 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() 
} 
}

关于ios - 对同一个 UITextField 使用两个输入 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42220548/

相关文章:

iphone - iOS 版 Facebook API 中的分析器警告

ios - xcode 7 Beta 6 中地标地址字典的更改

iphone - textFieldShouldReturn 不起作用(在 XCode 4 上使用 Storyboard)

ios - 有没有办法在离线模式下使用 iOS 语音识别?

iphone - sqlite3_prepare 错误 #26

iphone - iPhone 中的 ical API

iphone - 什么时候清除iPhone应用程序缓存?

iphone - CCFollow 与 CCParticleSystem

swift - Firebase 快照未正确解析数据

python - 如何在 IOS Swift 应用程序中运行 python 程序