2017-01-08 84 views
1

我花了大约3小时试图让UIDatePicker做我想做的事情。我将它设置为一个UITextField的动作,以便继续使用UIDatePicker的新视图控制器。这一切都工作。我可以选择一个日期并将其发送回原始视图控制器。UIDatePicker与间隔5分钟获取日期出现间隔

问题是我正在使用5分钟的时间间隔。如果我不移动日期选择器“轮子”并选择我的完成按钮返回到父控制器,则返回非间隔时间。所以11:37当我需要11:40时会返回11:37。但是,如果我更改“轮子”它将返回舍入时间。日期选择器当前显示出现5分钟的时间间隔。任何线索可以让我找到正确的解决方案?我试过setDateminuteIntervalUIDatePicker on viewDid出现无济于事。下面是我一直使用的代码:

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)'。但在此期间,实际上决定关闭完成按钮,直到选择/更改时间为止,因为在此应用程序中很可能他们不会选择正在开始的时间。 – user1881482