如何为 swift 中的一个文本字段禁用 DatePicker 交互(用于选择日期)”

How to disable DatePicker interaction(for selecting date) for one textfield in swift"

我正在为 fromDateTftoDateTf 文本字段使用 datePicker.. 现在我需要禁用 toDateTf 的日期选择器交互(意味着日期不应该 select)如果 fromDateTf 文本字段文本为空..怎么办?

对于日期选择器

let screenWidth = UIScreen.main.bounds.width

let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 216))


class PostServiceRequestVC: UIViewController, UITextViewDelegate {


@IBOutlet weak var toDateTf: UITextField!
@IBOutlet weak var fromDateTf: UITextField!


 override func viewDidLoad() {
    super.viewDidLoad()

    fromDateTf.addInputViewDatePicker(target: self, selector: #selector(doneButtonPressed), tag: 0)
    toDateTf.addInputViewDatePicker(target: self, selector: #selector(doneButtonPressed), tag: 1)
            
    
}


@objc func doneButtonPressed(_ sender: UIBarButtonItem) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let arr = [fromDateTf,toDateTf]
    
    let current = arr[sender.tag]
    if let datePicker = current?.inputView as? UIDatePicker {
        current?.text = dateFormatter.string(from: datePicker.date)
        
        current?.resignFirstResponder()
    }
            
}



extension UITextField {

func addInputViewDatePicker(target: Any, selector: Selector, tag: Int) {
    

    datePicker.datePickerMode = .date
    self.inputView = datePicker
    
    if #available(iOS 13.4, *) {
        datePicker.preferredDatePickerStyle = .wheels
        datePicker.sizeToFit()
    }
    let todaysDate = Date()

    datePicker.minimumDate = todaysDate
    
    let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 44))
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelPressed))
    let doneBarButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector)
    toolBar.setItems([cancelBarButton, flexibleSpace, doneBarButton], animated: false)

    doneBarButton.tag = tag
    
    self.inputAccessoryView = toolBar
}

@objc func cancelPressed() {
    self.resignFirstResponder()
}
}

使用上面的代码我可以select两个文本字段的日期..但是

这里 fromDateTf.text 是空的所以想禁用 toDateTf 的日期选择器的交互

我希望用户应该先select fromdate..没有fromdate我不想给select todate访问权限怎么办?...请帮帮我

编辑: 根据下面的回答,如果我在 viewDidLoad 中添加该代码,那么一直 toDateTf 阻止我显示日期选择器和 select日期

所以我在 doneButtonPressed 中添加了该代码,所以我第一次在这里显示日期选择器和 select 日期..但是如果 fromDateTf 从第二次开始是空的然后工作..但它第一次不工作..也是第一次如果fromDateTf是空的那么toDateTf.isEnabled = false应该工作..如何实现请帮助。

   @objc func doneButtonPressed(_ sender: UIBarButtonItem) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let arr = [fromDateTf,toDateTf]

    let current = arr[sender.tag]
    if let datePicker = current?.inputView as? UIDatePicker {

        if fromDateTf.text?.isEmpty ?? true {

               toDateTf.isEnabled = false
            
            } else {
               toDateTf.isEnabled = true
        }
        current?.text = dateFormatter.string(from: datePicker.date)

        current?.resignFirstResponder()
    }

}

您可以创建一个函数来检查 fromDateTf 是否为空,并相应地调整 UI:

func checkForText() {

     if fromDateTF.text == "" { //you can also use .isEmpty if you'd rather

        toDateTf.isEnabled = false 

     } else {

        toDateTf.isEnabled = true

     }

然后,您可以在您的 ViewDidLoad 中调用此函数,并且随后您可以随时更改文本框的任何内容。添加它的 else 部分是个好主意,这样当您填写 fromDateTf 时,它会重新启用另一个。