gpt4 book ai didi

ios - 如果我同时有开始日期和结束日期文本字段,我是否必须创建 2 个不同的 DatePickers?

转载 作者:行者123 更新时间:2023-11-30 12:27:52 25 4
gpt4 key购买 nike

当我单击开始日期文本字段和结束日期文本字段时,UIDatePicker 正在工作,但它更新的只是开始日期。

我是否需要创建单独的日期选择器,或者该日期选择器可以适用于您触摸的字段吗?

func createDatePicker() {

// format for picker
datePicker.datePickerMode = .date

// toolbar
let toolbar = UIToolbar()
toolbar.sizeToFit()

// bar button item
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(donePressed))
toolbar.setItems([doneButton], animated: false)

startDate.inputAccessoryView = toolbar
endDate.inputAccessoryView = toolbar

// assigning date picker to text field
startDate.inputView = datePicker
endDate.inputView = datePicker

}

最佳答案

实际上有一种方法可以使用 1 UIDatePicker 实例控制 多个 UITextField 实例。一种方法是通过其继承的 UIView 属性来跟踪当前选定的 UITextField

为了清楚起见,请使用枚举来区分文本字段:

fileprivate enum TextField: Int {
case startDateField
case endDateField
}

定义属性并使用 UIDateFormatter 在日期和字符串之间来回转换:

// MARK: - Properties

@IBOutlet weak var startDateTextField: UITextField!
@IBOutlet weak var endDateTextField: UITextField!
fileprivate var datePicker: UIDatePicker!
fileprivate var currentTextFieldResponder = TextField.startDateField
fileprivate let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .full
return formatter
}()

配置操作方法并将其连接到日期选择器,在每次值更改后触发:注意:文本字段的 .tag 属性也可以在 SB 中设置

// MARK: - View Lifecycle    

override func viewDidLoad() {
super.viewDidLoad()
// DatePicker base configuration
datePicker = UIDatePicker()
datePicker.datePickerMode = .date
datePicker.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: .valueChanged)
// Textfields configuration
startDateTextField.inputView = datePicker
startDateTextField.tag = 0
startDateTextField.delegate = self
endDateTextField.inputView = datePicker
endDateTextField.tag = 1
endDateTextField.delegate = self
}

根据当前选择的UITextField属性,更新相应的文本字段:

// MARK: - Actions    

func datePickerValueChanged(sender: UIDatePicker) {
let selectedDateText = dateFormatter.string(from: sender.date)
switch currentTextFieldResponder {
case .startDateField:
startDateTextField.text = selectedDateText
case .endDateField:
endDateTextField.text = selectedDateText
}
}

更新 currentTextFieldResponder 属性并将 datePicker UI 重置为之前的选择:

// MARK: - UITextFieldDelegate

extension ViewController: UITextFieldDelegate {

// Just after a text object becomes first responder
func textFieldDidBeginEditing(_ textField: UITextField) {
// Update current text responder and reset datePicker's date
currentTextFieldResponder = TextField(rawValue: textField.tag)!
if
let dateText = textField.text,
let date = dateFormatter.date(from: dateText) {
datePicker.date = date
}
}
}

作为奖励,设置 UIDatePicker.date 属性将自动为选取器列设置动画。

关于ios - 如果我同时有开始日期和结束日期文本字段,我是否必须创建 2 个不同的 DatePickers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43948956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com