UIDatePicker错误? UIControlEventValueChanged达到最小内部

我遇到了一个奇怪的效果,肯定看起来像是iOS7中的一个错误 – 但通常在过去,当我发现我在苹果的API中发现了一个错误时,结果是我自己的误解。

我有一个UIDatePicker与datePickerMode = UIDatePickerModeCountDownTimer和minuteInterval = 5。我初始化持续时间为1小时,并呈现给用户,在那里它显示为两列select器与小时和分钟。 (到现在为止还挺好。)

用户想“20分钟”,所以滚动小时列为0.在这一点上,select器读取0小时和0分钟,和iOS7是不酷,所以它自动滚动分钟轮5.我的UIControlEventValueChanged处理程序被调用,并且countDownDuration读取5分钟。 (还好。)

现在用户抓住分轮,并拖动到20. AND …我的UIControlEventValueChanged处理程序不会被调用。 (坏。)

如果我在UI中有其他事件检查dateselect器在这一点上,我确实看到countDownDuration被设置为20.但我无法知道用户改变它,此刻它被改变。 这是非常可重复的:它始终发生在第一次改变后,select器拒绝设置为0(自动进入5分钟)。

请注意,这是在iOS7; 它不会发生在iOS6(也许是因为select器有完美的内容被设置为0分钟)。

所以…我在这里错过了什么? 或者这是iOS7的一个真正的错误? 而在后一种情况下,有没有人比周期性地检查当前的时间间隔有更好的方法?

我也可以确认在UIDatePickerModeCountDownTimer模式下使用时,iOS 7.0.3 UIDatePicker中有一个bug。 当用户一次通过滚动轮子来改变值时,select器不会触发与UIControlEventValueChanged事件相关联的目标动作。 它适用于后续更改。

以下是一个有效的解决方法。 只需将将调度块中countDownDuration的初始值设置为主循环的代码即可。 每次将车轮旋转到新的值时,您的目标行动方法都会启动。 这种方法几乎没有开销,在iPhone 4和iPad 4上运行得非常好。

dispatch_async(dispatch_get_main_queue(), ^{ self.myDatePicker.countDownDuration = (NSTimeInterval) aNewDuration ; }); 

我仍然在7.1中遇到这个问题,但添加以下到UIControlEventValueChanged处理程序为我修复它。

 // Value Changed Event is not firing if minimum value hit dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ [self.myDatePicker setCountDownDuration: self.myDatePicker.countDownDuration]; }); 

如果有人仍然有datepicker的问题…我使用Swift / iOS 8 / Xcode 6.3

所以解决你不应该使用的问题

 picker.countDownDuration = NSTimeInterval 

相反,使用setDate

 picker.setDate(NSDate, animated: true) 

它直接在viewDidLoad() ,不需要使用`队列

如果有人仍然有datepicker的问题…我使用Swift / iOS 8 / Xcode 6.3

要解决这个问题,你不应该使用picker.countDownDuration = NSTimeInterval 。 使用.setDate(NSDate, animated: true)

它直接在viewDidLoad() ,不需要使用queues

完整的片段:

 override func viewDidLoad() { super.viewDidLoad() picker.setDate(setDateFromSeconds(seconds), animated: true) } func setDateFromSeconds(seconds: Double) -> (NSDate) { let intSeconds = Int(seconds) let minutes = (intSeconds / 60) % 60 let hours = intSeconds / 3600 let dateString = NSString(format: "%0.2d:%0.2d", hours, minutes) let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "hh:mm" return dateFormatter.dateFromString(dateString as String) as NSDate! } 

对于Swift 3:

 DispatchQueue.main.async(execute: { yourPicker.countDownDuration = TimeInterval() }) 

因为还没有答案被接受。 对于我来说,最简单的解决scheme就是简单地做到这一点

datePicker.countDownDuration =秒

在viewDidAppear而不是viewDidLoad

斯威夫特4

 @IBOutlet weak var fromPickerView: UIDatePicker! @objc func toPickerViewDateChanged() { fromPickerView.minimumDate = toPickerView.date } override func viewDidLoad() { super.viewDidLoad() toPickerView.backgroundColor = UIColor.white toPickerView.tintColor = .black toPickerView.maximumDate = Date() toPickerView.addTarget(self, action: #selector(toPickerViewDateChanged), for: UIControlEvents.valueChanged)