Как правильно установить минимальную дату и получить минимальную дату, отображаемую в окне выбора? - PullRequest
0 голосов
/ 18 октября 2018

enter image description here

У меня есть всплывающий контроллер вида, как на картинке выше.В viewDidLoad я установил минимальную дату для представления выбора сейчас (Date ()), а в раскадровке я установил интервал времени в 15 минут.Вот код, который я использую

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
    }

}

У меня есть 2 проблемы:

  1. пусть пользователь откроет всплывающее окно datePickerVC в 16:28.Я ожидаю, что минимальная дата и время, которые будут отображаться в этом всплывающем окне, будут «Сегодня 16:30», но в моем случае это «Сегодня 16:15».как решить эту проблему?

  2. , чтобы избежать значения ноль selectedDateAndTime, в viewDidLoad я установил selectedDateAndTime = dateTimePickerView.date, поэтому я надеюсь, что когда пользователь сразу нажмет кнопку сохранения иотправьте date в другой VC без прокрутки средства выбора даты, он получит минимальную дату, отображаемую в DatePicker.Допустим, пользователь открывает, что всплывает в 16:08, я ожидаю, что выбранная дата будет минимальной датой и временем, отображаемым в datePickerView (сегодня 16:15), но фактическое значение даты, которое я получаю (Сегодня 16:08),потому что я установил datePicker.minimumDate = Date() (сейчас).как получить минимальную дату, отображаемую в представлении datePicker?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018
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)
    }
}

Использование:

//add below code in viewDidLoad()
let nextMinuteIntervalDate = Date().rounded(
    minutes: 15,
    rounding: .ceil
)
dateTimePickerView.minimumDate = nextMinuteIntervalDate
dateTimePickerView.setDate(nextMinuteIntervalDate, animated: true)
0 голосов
/ 18 октября 2018
  1. Я думаю, вы должны осознавать тот факт, что почему он показывает 16:15, поскольку время (16:28) по-прежнему логически меньше 16:30, и я не думаю, что вы можетесделайте это, поскольку это не имеет никакого логического смысла

  2. объявлением minimumDate:

var минимум Дата: Дата?{get set}

Поскольку minimumDate имеет свойство get , вы можете просто получить минимальную дату , используя:

// Since it is an optional , we have to safe unwrap it 
if let minimumDate = datePicker.minimumDate {
   // Use your minimumDate variable here
} 
...