2011-09-21 70 views
14

我有一個時間模式的UIDatePicker,間隔爲15分鐘。我們假設現在是晚上7點22分。日期選擇器默認顯示的值是當前時間舍入到下一個更高/更低的值,在這種情況下,它是下午7點15分。如果用戶與日期選擇器交互,則顯示的值也是返回的值。然而,如果沒有任何用戶交互,並且我得到[UIDatePicker date]的時間,則返回值是確切的當前時間,即7:22來堅持該示例。是否有任何方法可以始終獲取實際顯示在日期選擇器上的值,而不是當前沒有拖延的時間,即使用戶沒有明確選擇一個值?我已經嘗試用[UIDatePicker setDate:[NSDate date]]手動設置選取器,但這不會改變行爲。UIDatePicker與15米的間隔,但始終確切的時間作爲返回值

任何提示?提前致謝!

+0

的可能重複:http://stackoverflow.com/questions/6948297/uidatepicker-odd-behavior-when-setting-minuteinterval – mja

+2

問題是,存儲在日期選擇器的日期不匹配顯示值,直到用戶更改選取器值。這要求預先間隔鉗位的日期被送入選擇器,否則如果用戶沒有明確地改變顯示的值,結果將不會被鉗位。結果是輸出值不會是用戶期望的,因爲它不是他們所看到的。我可以理解爲什麼它不會自動調整(單純,以及保留其他時間組件,例如可能希望在某些情況下被用戶屏蔽的秒),但我們如何強制它? – ima747

+0

@ ima747感謝您的澄清! – TigreFurry

回答

11

這不是一個完美的解決方案,但它適用於我。我從另一篇文章中將其修改並修改爲接受不同的值。

- (NSDate*)clampDate:(NSDate *)dt toMinutes:(int)minutes { 
int referenceTimeInterval = (int)[dt timeIntervalSinceReferenceDate]; 
int remainingSeconds = referenceTimeInterval % (minutes*60); 
int timeRoundedTo5Minutes = referenceTimeInterval - remainingSeconds; 
if(remainingSeconds>((minutes*60)/2)) {/// round up 
    timeRoundedTo5Minutes = referenceTimeInterval +((minutes*60)-remainingSeconds);    
} 
return [NSDate dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)timeRoundedTo5Minutes]; 
} 

飼料它的輸入日期和一分鐘的值(從UIDatePicker.minuteInterval在此線程的情況下采取的),它會返回一個時刻夾持到該間隔而可以供給到選擇器。

6

我修改了@ ima747的答案Swift 3/4和作爲UIDatePicker的擴展名。 picker.clampedDate

extension UIDatePicker { 
    /// Returns the date that reflects the displayed date clamped to the `minuteInterval` of the picker. 
    /// - note: Adapted from [ima747's](http://stackoverflow.com/users/463183/ima747) answer on [Stack Overflow](http://stackoverflow.com/questions/7504060/uidatepicker-with-15m-interval-but-always-exact-time-as-return-value/42263214#42263214}) 
    public var clampedDate: Date { 
     let referenceTimeInterval = self.date.timeIntervalSinceReferenceDate 
     let remainingSeconds = referenceTimeInterval.truncatingRemainder(dividingBy: TimeInterval(minuteInterval*60)) 
     let timeRoundedToInterval = referenceTimeInterval - remainingSeconds 
     return Date(timeIntervalSinceReferenceDate: timeRoundedToInterval) 
    } 
} 
相關問題