簡體   English   中英

間隔為5分鍾的UIDatePicker以間隔顯示日期

[英]UIDatePicker with 5 min interval get date on appear with interval

我花了大約3個小時試圖讓UIDatePicker來完成我想要的工作。 我將其設置為UITextField的動作,以使用UIDatePicker鎖定到新的視圖控制器。 一切正常。 我已經能夠選擇一個日期並將其發送回原始視圖控制器。

問題是我使用5分鍾的時間間隔。 如果我不移動日期選擇器“滾輪”並選擇完成”按鈕以返回到父控制器,則將返回非間隔時間。 所以當我需要11:40時11:37返回11:37。 但是,如果我更改“車輪”,它將返回四舍五入的時間。 日期選擇器當前顯示5分鍾間隔出現。 有什么線索可以引導我找到正確的解決方案? 我已經在viewDidAppear的UIDatePicker上嘗試過setDateminuteInterval無效。 以下是我一直在使用的代碼:

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)
}
}

您可以檢查日期並將其四舍五入為您的需求,如下所示:

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
    }
}

隨時詢問是否不清楚!

另一種選擇是創建一個擴展名,該擴展名允許您調整初始化UIDatePicker時設置的日期值的間隔。

extension Date {
    var nearest30Min: Date {
        var dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: self)
        guard let hours = dateComponents.hour else { return self }

        switch dateComponents.minute ?? 0 {
        case 0...14:
            dateComponents.minute = 0
        case 15...44:
            dateComponents.minute = 30
        case 44...59:
            dateComponents.minute = 0
            dateComponents.hour = hours + 1
        default:
            break
        }

        return dateComponents.date ?? self
    }
}

初始化UIDatePicker之后,可以使用以下代碼更新datePicker's值:

datePicker.setDate(datePicker.date.nearest30min, animated: false)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM