2011-09-21 15 views
14

Zaman modunda 15 dakika arayla UIDatePicker'ım var.UIDatePicker 15m aralıklı ancak dönüş değeri olarak her zaman tam olarak

Diyelim ki saat 7:22. Tarih seçicinin varsayılan olarak gösterdiği değer, geçerli zamanın bir sonraki üst/alt değere yuvarlanmasıdır, bu durumda, saat 7: 15'tür. Kullanıcı tarih seçiciyle etkileşimde bulunursa, gösterilen değer de döndürülen değerdir. Bununla birlikte, herhangi bir kullanıcı etkileşimi olmamışsa ve [UIDatePicker date] ile zamana sahip olursam, geri dönüş değeri tam geçerli saattir, yani 7:22 örnekle uyuşmaktadır. Kullanıcı açıkça bir değer almamış olsa bile, gerçek zaman aralığı yerine tarih seçicide gösterilen değeri her zaman almanın bir yolu var mı? Seçiciyi [UIDatePicker setDate:[NSDate date]] ile elle ayarlamayı denedim, ancak bu davranış değiştirmiyor.

Herhangi bir ipucu? Şimdiden teşekkürler!

+0

olası yinelenen: http://stackoverflow.com/questions/6948297/uidatepicker-odd-behavior-when-setting-minuteinterval – mja

+2

sorunu tarih seçici saklanan tarih eşleşmiyor olduğunu Seçici değeri kullanıcı tarafından değiştirilinceye kadar görüntülenen değer. Bu, önceden aralıklı klemplenmiş tarihlerin seçiciye beslenmesini zorunlu kılar, aksi takdirde kullanıcı açıkça görüntülenen değeri değiştirmezse sonuçlar kelepçelenmeyecektir. Sonuç, çıktı değeri, kullanıcının gördükleri şey olmadığı için beklediği şey değildir. Neden otomatik olarak ayarlanmayacağını anlayabiliyorum (bazı durumlarda kullanıcılardan maskelenmesini isteyebilecek saniyeler gibi diğer zaman bileşenlerini saklamanın yanı sıra basittir), ancak bunu nasıl zorlayacağız? – ima747

+0

@ ima747 Artığınız için teşekkür ederiz! – TigreFurry

cevap

11

Bu mükemmel bir çözüm değil ama benim için çalışıyor. Başka bir gönderiden aldım ve farklı değerleri kabul etmek için değiştirdim.

- (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]; 
} 

Yem o bir giriş tarihini ve bir dakika (bu iplik halinde UIDatePicker.minuteInterval alınan) değeri ve bir zaman seçme aracına beslemek anlamına aralık kenetlendi dönecektir.

6

Swift 3/4 için @ ima747'nin yanıtını ve UIDatePicker'un bir uzantısı olarak değiştirdim. 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) 
    } 
} 
İlgili konular