首页 > 解决方案 > Swift:如何制作显示日期和时间范围的 uipickerview

问题描述

我可以显示时间并更改时间间隔,但我不知道如何获得如下图所示日期的时间范围,除非我对其进行硬编码。如果我不需要的话,尽量避免使用任何可可足类动物。现在我正在对其进行硬编码,但只有时间,如果没有另一个UIPicker.

与问题相关的代码UIPickerView

private var deliveryTimesPicker = UIPickerView()
private var deliveryTimes = ["10 AM - 11 AM", "11 AM - 12 PM", "12 PM - 1 PM", "1 PM - 2 PM", "2 PM - 3 PM", "3 PM - 4 PM", "4 PM - 5 PM", "5 PM - 6 PM", "6 PM - 7 PM", "7 PM - 8 PM", "8 PM - 9 PM", "9 PM - 10 PM", "10 PM - 11 PM"]
private var selectedDeliveryTime = 0

override func viewDidLoad() {
    ...
    self.deliveryTimeTF.text = self.deliveryTimes.first!

    self.doneToolbar.barStyle = .default
    self.doneToolbar.isTranslucent = true
    self.doneToolbar.isUserInteractionEnabled = true
    self.doneToolbar.setItems([
        UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(self.dismissKeyboard)),
        UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
        UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.pickerViewDone))
        ], animated: true)
    self.doneToolbar.sizeToFit()

    self.deliveryTimesPicker.delegate = self
    self.deliveryTimesPicker.dataSource = self
    self.deliveryTimesPicker.tag = 0
    self.deliveryTimesPicker.selectRow(self.selectedDeliveryTime, inComponent: 0, animated: true)
    self.deliveryTimeTF.inputView = self.deliveryTimesPicker
    self.deliveryTimeTF.inputAccessoryView = self.doneToolbar
}


@objc func pickerViewDone() {
    if self.deliveryTimeTF.isEditing {
        self.deliveryTimeTF.text = self.deliveryTimes[self.selectedDeliveryTime]
    }
    dismissKeyboard()
}

extension RequestViewController: UIPickerViewDelegate {
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView.tag == 0 {
            self.selectedDeliveryTime = row
            return self.deliveryTimes[self.selectedDeliveryTime]
        }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView.tag == 0 {
             self.selectedDeliveryTime = row
        }
    }

}

我的怎么样:

在此处输入图像描述

我希望它如何(颜色主题并不重要,只是它的功能): 从skipthedishes应用程序

标签: iosswiftuipickerview

解决方案


除非我对其进行硬编码,否则我不知道如何获得如下图所示日期的时间范围。

然后你应该阅读Date, DateInterval,DateComponents等。选择一个开始日期并使用它来生成一个开始日期和结束日期对的列表。这是一些伪代码:

let start = Date()
var timeframes = (Date,Date)[]
for i in (0..9) {
    let t1 = Date(timeInterval: (i * secondsBetweenStarts) since:start)
    let t2 = Date(timeInterval: timeFrameDuration since:t1)
    let timeframe = (t1, t2)
    timeframes.append(timeframe)
}

当然,您必须填写secondsBetweenStartstimeFrameDuration的值。还有很多其他的方法来构建日期——例如,使用日期组件可以很容易地创建在小时边界开始和结束的时间段。无论如何,这个想法只是创建一个开始和结束时间的数组。从那里应该很容易生成描述这些时间范围的字符串列表,您可以在选择器中使用该字符串列表。


推荐阅读