【问题标题】:UIDatePicker - allow selecting time within two rangesUIDatePicker - 允许在两个范围内选择时间
【发布时间】:2019-10-29 09:27:08
【问题描述】:

在我们的应用程序中,我们有一个UIDatePicker,设置为模式Time。 这个日期选择器是用户让用户选择外卖订单的时间。

只能在每天的特定时间范围内下单,为此我们使用属性minimumDatemaximumDate。现在我们想让它让用户可以在两个不同的范围中选择一个时间。比方说,09:00 - 12:0013:00 - 17:00 的订单是允许的,拣货员应该只允许选择这些时间。

据我所知,默认情况下这是不可能的,因为我现在使用的属性只是单个时间对象,而不是范围。一个解决方案可能是手动实施,但似乎没有可用于UIDatePickerdelegate

我想知道的是,有人知道实现此类功能的良好、干净的方法,同时仍使用UIDatePicker,而不是UIPickerView

如果它有一个委托方法,如canSelectDate(_:) -> Bool,则一个不错的选择是,如果false,它将动画返回到之前的值。在这里,我可以使用范围来确定它。

【问题讨论】:

  • 为什么不使用两个日期选择器?
  • 这似乎有点矫枉过正。整个想法是只有一个选择器可以完成所有工作。可能有 3 或 4 个间隔的情况,我们不希望有多个选择器,而您只能选择一个时间。

标签: ios swift datepicker


【解决方案1】:

你可以像这样对选择器的变化做出反应:

picker.addTarget(self, action: #selector(MyViewController.pickerChanged), for: .valueChanged)

然后你的函数看起来像这样:

@objc
private func pickerChanged(_ picker: UIDatePicker) {
    let dateIsAtLunchtime = picker.date >= lunchStart && picker.date <= lunchEnd
    if dateIsAtLunchtime {
        picker.setDate(lunchEnd, animated: true)
    }
}

如果您的日期是这样定义的:

let morningComponents = DateComponents(calendar: .current, hour: 8, minute: 0)
var morning: Date { return morningComponents.date ?? Date() }
let lunchStartComponents = DateComponents(calendar: .current, hour: 12, minute: 30)
var lunchStart: Date { return lunchStartComponents.date ?? Date() }
let lunchEndComponents = DateComponents(calendar: .current, hour: 14, minute: 30)
var lunchEnd: Date { return lunchEndComponents.date ?? Date() }
let eveningComponents = DateComponents(calendar: .current, hour: 18, minute: 0)
var evening: Date { return eveningComponents.date ?? Date() }

【讨论】:

  • 谢谢,这是一个很好且可以接受的解决方案。我会用这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2020-07-14
  • 1970-01-01
  • 2020-09-06
相关资源
最近更新 更多