ios - 2个UIDatepickerView在一个ViewController中
问题描述
我想使用 2UIDatePickerView
合 1 ViewController
。我使用了 2 个文本字段fromeDate
,toDate
但是当我选择fromdate
文本字段时,它会自动选择其他toDate
。
我想知道如何UIDatePickerview
在 1 个视图控制器中使用 2 个或更多。
这是我的代码:
@IBOutlet weak var fromDateTxtField: UITextField!
@IBOutlet weak var toDateTxtField: UITextField!
private var datePickerFrom: UIDatePicker?
private var datepickerTo : UIDatePicker?
override func viewDidLoad() {
super.viewDidLoad()
datePickerFrom = UIDatePicker()
datepickerTo = UIDatePicker()
datePickerFrom?.datePickerMode = .date
datepickerTo?.datePickerMode = .date
fromDateTxtField.inputView = datePickerFrom
toDateTxtField.inputView = datepickerTo
showDatePicker()
}
func showDatePicker(){
datePickerFrom?.datePickerMode = .date
let toolBar = UIToolbar()
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(doneDatePicker))
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancle", style: .plain, target: self, action: #selector(cancelDatePicker))
toolBar.setItems([doneButton, spaceButton, cancelButton], animated: false)
fromDateTxtField.inputAccessoryView = toolBar
fromDateTxtField.inputView = datePickerFrom
toDateTxtField.inputAccessoryView = toolBar
toDateTxtField.inputView = datepickerTo
}
@objc func doneDatePicker ()
{
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
fromDateTxtField.text = formatter.string(from: (datePickerFrom?.date)!)
toDateTxtField.text = formatter.string(from: (datepickerTo?.date)!)
self.view.endEditing(true)
}
@objc func cancelDatePicker()
{
self.view.endEditing(true)
}
解决方案
这是两个文本字段
@IBOutlet weak var txtOnwardDate: UITextField!
@IBOutlet weak var txtReturnDate: UITextField!
var onwardDate: Date?
var returnDate: Date?
自定义日期选择器
func customizeDatePicker() {
datePicker.datePickerMode = .date
datePicker.minimumDate = Date()
datePicker.addTarget(self, action: #selector(datePickerValueChanged), for: .valueChanged)
let toolBar = UIToolbar()
let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(donePressed))
let cancel: UIBarButtonItem = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.done, target: self, action: #selector(cancelPressed))
toolBar.barTintColor = fillColor
var items: [UIBarButtonItem] = Array()
items.append(cancel)
items.append(flexSpace)
items.append(done)
toolBar.items = items
toolBar.sizeToFit()
txtOnwardDate.inputAccessoryView = toolBar
txtReturnDate.inputAccessoryView = toolBar
txtOnwardDate.inputView = datePicker
txtReturnDate.inputView = datePicker
}
使用 textField 委托来确定当前选择的 textField。
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField == txtOnwardDate {
if let onwardDate = onwardDate{
datePicker.setDate(onwardDate, animated: true)
}
datePicker.minimumDate = Date()
}
if textField == txtReturnDate {
if let returnDate = returnDate{
datePicker.setDate(returnDate, animated: true)
}
datePicker.minimumDate = onwardDate
}
}
func datePickerValueChanged() {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MMMM, yyyy"
let dateString = dateFormatter.string(from: datePicker.date)
if txtOnwardDate.isFirstResponder {
onwardDate = datePicker.date
if let onwardDate = onwardDate, let returnDate = returnDate, onwardDate > returnDate {
txtReturnDate.text = ""
self.returnDate = nil
}
txtOnwardDate.text = dateString
}else {
returnDate = datePicker.date
txtReturnDate.text = dateString
}
}
推荐阅读
- javascript - 文件夹浏览器可以包含在 Windows 7 小工具中吗?
- rstudio - 表格标题呈现在表格上方而不是下方
- javascript - ajax请求后如何更新变量?
- object - 从已创建的对象中获取信息
- sql - 使用自动编号更新列
- javascript - 如何根据上一个 html 的值动态加载 html 中的 SELECT 选项
- c# - 具有相同数据源的两个 ComboBox 导致选择被遗忘
- jquery - 用于图像预加载器的延迟的 Jquery 数组
- html - 在移动设备上将按钮更改为卡片
- sql - 编写 Oracle Left Join 以生成非规范化分隔列