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

Posted

技术标签:

【中文标题】如何在 swift 中为一个文本字段禁用 DatePicker 交互(用于选择日期)“【英文标题】:How to disable DatePicker interaction(for selecting date) for one textfield in swift" 【发布时间】:2021-10-22 05:37:18 【问题描述】:

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

日期选择器

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()


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

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

我希望用户首先选择 fromdate.. 没有 fromdate 我不想授予选择 todate 的访问权限如何?...请帮助我

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

所以我在doneButtonPressed 中添加了该代码,所以在这里我第一次可以显示日期选择器并选择日期.. 但是从第二次开始,如果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()
    


【问题讨论】:

【参考方案1】:

您可以创建一个函数来检查 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 时,它会重新启用另一个。

【讨论】:

以上是关于如何在 swift 中为一个文本字段禁用 DatePicker 交互(用于选择日期)“的主要内容,如果未能解决你的问题,请参考以下文章

如何限制 Swift 中文本字段中的数字?

当文本字段为空时禁用警报按钮 Swift 3

如何在 Swift 中为日期选择器设置特定的默认时间

Swift 如何在另一个 UITextField 突出显示或具有值时禁用 TextField

textFieldShouldReturn 无法在 swift 3 中将焦点从一个文本字段更改为另一个文本字段

在 Swift 项目中为生产禁用 NSLog