首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确设置最小日期并获取在“选择器”视图上显示的最小日期?

问如何正确设置最小日期并获取在“选择器”视图上显示的最小日期?
EN

Stack Overflow用户
提问于 2018-10-18 09:44:51
回答 2查看 431关注 0票数 1

​

​

我有一个弹出式视图控制器,就像上面的图片。在viewDidLoad中,我将选择器视图的最小日期设置为现在( Date() ),在情节提要中,我将间隔时间设置为15分钟。下面是我使用的代码

代码语言:javascript
复制
class DateTimePickerVC: UIViewController {


    @IBOutlet var dateTimePickerView: UIDatePicker!

    var selectedDateAndTime : Date?

    override func viewDidLoad() {
        super.viewDidLoad()

        // to make live update of selected date
        dateTimePickerView.addTarget(self, action: #selector(DateTimePickerVC.datePickerValueChanged), for: UIControl.Event.valueChanged)

        // minimum date is now
        dateTimePickerView.minimumDate = Date()

        // set initial value, to avoid nil value
        selectedDateAndTime = dateTimePickerView.date


    }

    @objc func datePickerValueChanged (datePicker: UIDatePicker) {
        selectedDateAndTime = datePicker.date
    }



    @IBAction func pickedButtonDidPressed(_ sender: Any) {
        // send date 'selectedDateAndTime' to other VC
    }

}

我这里有两个问题:

  1. 假设用户在16:28打开弹出的datePickerVC。我希望在弹出处显示的最小日期和时间是“今日16:30",但在我的情况下是”今日16:15“。如何解决这个问题?
  2. 为了避免selectedDateAndTime的零值,我在viewDidLoad中设置了selectedDateAndTime = dateTimePickerView.date,因此我希望当用户立即点击“保存”按钮并将date发送到其他VC而不滚动数据选择器时,它将获得datePicker中显示的最小日期。假设用户在16:08打开弹出的日期,我希望选定的日期是在datePickerView (今天16:15)显示的最小日期和时间,但是我得到的实际日期值是(今天16:08),因为我设置了datePicker.minimumDate = Date() (now)。如何获得datePicker视图上显示的最小日期?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-18 11:21:34

代码语言:javascript
复制
enum DateRoundingType {
    case round
    case ceil
    case floor
}


extension Date {
    func rounded(minutes: TimeInterval, rounding: DateRoundingType = .round) -> Date {
        return rounded(seconds: minutes * 60, rounding: rounding)
    }
    func rounded(seconds: TimeInterval, rounding: DateRoundingType = .round) -> Date {
        var roundedInterval: TimeInterval = 0
        switch rounding  {
        case .round:
            roundedInterval = (timeIntervalSinceReferenceDate / seconds).rounded() * seconds
        case .ceil:
            roundedInterval = ceil(timeIntervalSinceReferenceDate / seconds) * seconds
        case .floor:
            roundedInterval = floor(timeIntervalSinceReferenceDate / seconds) * seconds
        }
        return Date(timeIntervalSinceReferenceDate: roundedInterval)
    }
}

用法:

代码语言:javascript
复制
//add below code in viewDidLoad()
let nextMinuteIntervalDate = Date().rounded(
    minutes: 15,
    rounding: .ceil
)
dateTimePickerView.minimumDate = nextMinuteIntervalDate
dateTimePickerView.setDate(nextMinuteIntervalDate, animated: true)
票数 2
EN

Stack Overflow用户

发布于 2018-10-18 10:07:44

  1. 我认为你必须意识到,为什么16:15时间(16:28)在逻辑上仍然少于16:30,我认为你不能这样做,因为这没有任何逻辑意义。
  2. 通过minimumDate的声明:

变量minimumDate:日期?{ get set }

由于minimumDate具有get属性,所以可以使用以下方法获取最小日期:

代码语言:javascript
复制
// Since it is an optional , we have to safe unwrap it 
if let minimumDate = datePicker.minimumDate {
   // Use your minimumDate variable here
} 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52871312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档