2011-09-21 3 views
14

के रूप में सटीक समय मुझे 15 मिनट के अंतराल के साथ टाइम मोड में एक UIDatePicker मिला है।यूआईडीएटीपीकर 15 मीटर अंतराल के साथ लेकिन हमेशा वापसी मूल्य

मान लें कि यह 7:22 बजे है। जिस तारीख को डेट पिकर प्रति डिफ़ॉल्ट दिखाता है वह वर्तमान समय अगले उच्च/निचले मूल्य पर गोल होता है, इस मामले में, यह 7:15 बजे है। यदि उपयोगकर्ता दिनांक पिकर के साथ इंटरैक्ट करता है, तो दिखाया गया मूल्य भी मूल्य लौटाया जाता है। हालांकि अगर कोई उपयोगकर्ता इंटरैक्शन नहीं हुआ है और मुझे [UIDatePicker date] के साथ समय मिलता है तो रिटर्न वैल्यू सटीक वर्तमान समय है, यानी उदाहरण के साथ चिपकने के लिए 7:22। क्या वर्तमान समय के बजाय दिनांक पिकर पर वास्तव में दिखाए जाने वाले मूल्य को प्राप्त करने का कोई तरीका है, भले ही उपयोगकर्ता ने स्पष्ट रूप से कोई मूल्य नहीं लिया हो? मैंने पहले से ही [UIDatePicker setDate:[NSDate date]] के साथ पिकर को मैन्युअल रूप से सेट करने का प्रयास किया है लेकिन यह व्यवहार को नहीं बदलेगा।

कोई संकेत? अग्रिम में धन्यवाद!

+0

के संभावित डुप्लिकेट: http://stackoverflow.com/questions/6948297/uidatepicker-odd-behavior-when-setting-minuteinterval – mja

+2

समस्या है जो किसी दिनांक पिकर में संग्रहीत तारीख से मेल नहीं खाता प्रदर्शित मूल्य जब तक उपयोगकर्ता द्वारा पिकर मूल्य बदल जाता है। यह जनादेश है कि पूर्व अंतराल-clamped दिनांक पिकर यदि उपयोगकर्ता स्पष्ट रूप से प्रदर्शित मान नहीं बदलता है अन्यथा परिणाम clamped नहीं की जाएगी में खिलाया जा सकता है। नतीजा यह है कि आउटपुट वैल्यू वह नहीं होगा जो उपयोगकर्ता अपेक्षा करता है क्योंकि यह वह नहीं है जो वे देखते हैं। मैं समझ सकता क्यों यह ऑटो (simplicty, साथ ही सेकंड जो कुछ मामलों में उपयोगकर्ता से नीचे दब जाती करना चाह सकते हैं जैसे अन्य समय घटकों संरक्षण), लेकिन हम इसे कैसे मजबूर करते समायोजित नहीं होगा? – 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

मैं स्विफ्ट 3/4 के लिए और UIDatePicker के विस्तार के रूप @ ima747 के जवाब संशोधित कर लिया है। 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) 
    } 
}