【问题标题】:Using datePicker for multiple textfields in iOS swift在 iOS swift 中为多个文本字段使用 datePicker
【发布时间】:2018-04-23 06:10:18
【问题描述】:

我有 4 个文本字段,我必须为 userServiceBooking 设置 fromDatefromTimetoDatetoTime。现在,我需要用UIDatePicker 填充这些文本字段,但我无法显示文本,也不知道为什么;也许我做错了……

我发布了我尝试过的代码,请有人研究一下并告诉我该怎么做。

代码:

import UIKit

class ConfirmRequestViewController: UIViewController,UITextFieldDelegate {

  @IBOutlet weak var fromDateTF: UITextField!
  @IBOutlet weak var toDateTF: UITextField!
  @IBOutlet weak var fromTimeTF: UITextField!
  @IBOutlet weak var toTimeTF: UITextField!
  var datePicker = UIDatePicker()
  var dateFormatter = DateFormatter()
  var toolBar = UIToolbar()

 override func viewDidLoad() {
        super.viewDidLoad()
 }

 func textFieldDidBeginEditing(_ textField: UITextField) {

        if textField == fromDateTF {

            datePicker.datePickerMode = .date
            fromDateTF.inputView = datePicker

            fromDateTF.text = dateFormatter.string(from: datePicker.date)

            toolBar.sizeToFit()

            let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped))
            toolBar.setItems([doneButton], animated: true)
            fromDateTF.inputAccessoryView = toolBar
        }
        if textField == toDateTF {

            datePicker.datePickerMode = .date
            toDateTF.inputView = datePicker

            toolBar.sizeToFit()

            let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped))
            toolBar.setItems([doneButton], animated: true)
            toDateTF.inputAccessoryView = toolBar
        }
        if textField == fromTimeTF {

            datePicker.datePickerMode = .time
            fromTimeTF.inputView = datePicker

            toolBar.sizeToFit()

            let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped))
            toolBar.setItems([doneButton], animated: true)
            fromTimeTF.inputAccessoryView = toolBar
        }
        if textField == toTimeTF {

            datePicker.datePickerMode = .time
            toTimeTF.inputView = datePicker

            toolBar.sizeToFit()

            let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped))
            toolBar.setItems([doneButton], animated: true)
            toTimeTF.inputAccessoryView = toolBar
        }
    }

    @objc func doneButtonTapped(textField: UITextField) {

        if textField == fromDateTF {

            dateFormatter.dateStyle = .medium
            dateFormatter.timeStyle = .none
            fromDateTF.text = dateFormatter.string(from: datePicker.date)
        }
        if textField == toDateTF {

            dateFormatter.dateStyle = .medium
            dateFormatter.timeStyle = .none
            toDateTF.text = dateFormatter.string(from: datePicker.date)
        }
        if textField == fromTimeTF {

            dateFormatter.dateStyle = .none
            dateFormatter.timeStyle = .medium
            fromTimeTF.text = dateFormatter.string(from: datePicker.date)
        }
        if textField == toTimeTF {

            dateFormatter.dateStyle = .none
            dateFormatter.timeStyle = .medium
            toTimeTF.text = dateFormatter.string(from: datePicker.date)
        }
        self.view.endEditing(true)
    }
 }

【问题讨论】:

  • 这个方法被调用还是没有 doneButtonTapped
  • @Anbu.karthik 感谢您的快速回复。是的,它正在调用方法 doneButtonTapped() 但它不会进入我当前正在编辑的任何文本字段的 if 条件..

标签: ios uitextfield swift4 uidatepicker


【解决方案1】:

试试这个。

override func viewDidLoad() {
    super.viewDidLoad()

    fromDateTF.inputView    = datePicker
    toDateTF.inputView      = datePicker
    fromTimeTF.inputView    = datePicker
    toTimeTF.inputView      = datePicker

    toolBar.sizeToFit()
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped))
    toolBar.setItems([doneButton], animated: true)
    fromDateTF.inputAccessoryView   = toolBar
    toDateTF.inputAccessoryView     = toolBar
    fromTimeTF.inputAccessoryView   = toolBar
    toTimeTF.inputAccessoryView     = toolBar
}


func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField == fromDateTF {
            datePicker.datePickerMode = .date
        }
        if textField == toDateTF {
            datePicker.datePickerMode = .date
        }
        if textField == fromTimeTF {
            datePicker.datePickerMode = .time
        }
        if textField == toTimeTF {
            datePicker.datePickerMode = .time
        }
    }

@objc func doneButtonTapped() {
    if fromDateTF.isFirstResponder {
        dateFormatter.dateStyle = .medium
        dateFormatter.timeStyle = .none
        fromDateTF.text = dateFormatter.string(from: datePicker.date)
    }
    if toDateTF.isFirstResponder {
        dateFormatter.dateStyle = .medium
        dateFormatter.timeStyle = .none
        toDateTF.text = dateFormatter.string(from: datePicker.date)
    }
    if fromTimeTF.isFirstResponder {
        dateFormatter.dateStyle = .none
        dateFormatter.timeStyle = .medium
        fromTimeTF.text = dateFormatter.string(from: datePicker.date)
    }
    if toTimeTF.isFirstResponder {
        dateFormatter.dateStyle = .none
        dateFormatter.timeStyle = .medium
        toTimeTF.text = dateFormatter.string(from: datePicker.date)
    }
    self.view.endEditing(true)
}

【讨论】:

  • 它将验证所有文本字段
  • @Anbu.karthik,对不起,我没有得到你。
  • @Kuldeep 这很好用。多谢兄弟。唯一的变化是代替if textfield == fromDateTF{ code } 我必须写if fromDateTF.isFirstResponder{ code }。所以方法 doneButtonPressed() 不需要 textField 参数。
  • @VenkateshChejarla,不要多次创建doneButton,而是创建一次。
  • @Kuldeep 是的,很抱歉没有提及,我做到了。但是,我只是说它不起作用的主要原因是因为没有使用.isFirstResponder..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
相关资源
最近更新 更多