2017-01-08 3 views
1

Я потратил около 3 часов, пытаясь получить UIDatePicker, чтобы сделать то, что я хочу, чтобы он делал. У меня есть настройка в качестве действия UITextField, чтобы перейти к новому контроллеру представления с помощью UIDatePicker. Все это работает. Мне удалось выбрать дату и отправить ее обратно в исходный контроллер.UIDatePicker с 5-минутным интервалом даты получения с интервалом

Проблема в том, что я использую 5-минутные интервалы времени. Если я не переместил выбор даты «колеса» и выберите мою кнопку «Готово», чтобы вернуться к родительскому контроллеру, возвращается время без интервала. Итак, 11:37 возвращается 11:37, когда мне нужно 11:40. Однако, если я изменю «колеса», он возвращает округленное время. Датчик даты показывает, что отображаются 5-минутные интервалы. Любые подсказки, чтобы привести меня к правильному решению? Я пробовал setDate и minuteInterval на UIDatePicker на viewDidAppear безрезультатно. Ниже приведен код, который я использую:

protocol DatePickerDelegate { 
    func datePickerDidSelect(selectedDate: String) 
} 

class DatePickerVC: UIViewController { 

@IBOutlet weak var pickerView: UIDatePicker! 

var selectedDate = "" 
var delegate : DatePickerDelegate? 


override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override func viewDidAppear(_ animated: Bool) { 
    //setDate() 
    //Have tried using setDate and minuteInterval here 
} 

func formatDate() -> DateFormatter { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "MMM d, yyyy h:mm a" 
    return dateFormatter 
} 

func setDate() { 
    let dateFormatter = formatDate() 
    selectedDate = dateFormatter.string(from: pickerView.date) 
    self.delegate?.datePickerDidSelect(selectedDate: selectedDate) 
    print(selectedDate) 
} 

@IBAction func datePickerChanged(_ sender: Any) { 
    setDate() 
} 

@IBAction func doneBtnPressed(_ sender: Any) { 
    self.dismiss(animated: true, completion: nil) 
} 

@IBAction func cancelBtnPressed(_ sender: Any) { 
    self.dismiss(animated: true, completion: nil) 
} 
} 

ответ

2

вы можете проверить дату и вокруг него с вашими потребностями, как это:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let calendar = Calendar.current 
    var dateComponents = calendar.dateComponents([.month, .day, .year, .hour, .minute], from: datePicker.date) 
    guard var hour = dateComponents.hour, var minute = dateComponents.minute else { 
     print("something went wrong") 
     return 
    } 

    let intervalRemainder = minute % datePicker.minuteInterval 
    if intervalRemainder > 0 { 
     // need to correct the date 
     minute += datePicker.minuteInterval - intervalRemainder 
     if minute >= 60 { 
      hour += 1 
      minute -= 60 
     } 

     // update datecomponents 
     dateComponents.hour = hour 
     dateComponents.minute = minute 

     // get the corrected date 
     guard let roundedDate = calendar.date(from: dateComponents) else { 
      print("something went wrong") 
      return 
     } 

     // update the datepicker 
     datePicker.date = roundedDate 
    } 
} 

не стесняйтесь спросить, если что-то непонятно!

+0

Я получил это для работы, однако мне пришлось изменить 'datePicker.date = roundedDate' на' datePicker.setDate (roundedDate, animated: false) '. Но в то же время на самом деле решили отключить кнопку «done» до тех пор, пока не будет выбрано/изменено время, так как более вероятно, что в этом приложении они не будут выбирать время начала, прямо сейчас. – user1881482

Смежные вопросы