【问题标题】:Using Two inputviews for same UITextField对同一个 UITextField 使用两个输入视图
【发布时间】: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


【解决方案1】:

喜欢

第一步

删除方法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() 
} 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多