UIDate Picker valuechanged不会更新第一个旋转,但会在iOS之后进行旋转

我有一个UIDate Pickerembedded到一个静态TableViewCell中,此刻我禁用了大部分代码,除了负责dateselect器的代码。

我使用date选取器作为倒数计时器

所以,除了一些常见的网点和变数之外,

override func viewDidLoad() { super.viewDidLoad() // tfName.delegate = self // tfDescription.delegate = self // datePicker.countDownDuration = 60 // pickerValueChanged(self) } @IBAction func pickerValueChanged(sender: AnyObject) { seconds = Int(datePicker.countDownDuration) hours = seconds / 3600 if hours == 0{ minutes = seconds / 60 } else{ minutes = seconds % 3600 / 60 } labelDuration.text = "\(hours) hours \(minutes) minutes" } 

当我第一次改变Picker的值时,值改变的函数根本不会触发,但是在它之后的旋转没有失败。

我试图在viewDidLoad调用它,用pickerValueChanged(self) ,并且工作,但是不能解决问题。 此外,我注释了pickerValueChanged函数和viewDidLoad中的每一行代码,但它仍然没有触发第一个旋转..

感谢您的时间!

更新:添加图片

第一次旋转后,pickerValueChanged不会被调用: 首先旋转

从第二次旋转开始,事件被调用并且标签被更新: 第二次旋转

尝试:

执行: datePicker.setDate(NSDate(), animated: true viewDidLoad() datePicker.setDate(NSDate(), animated: true解决了事件在第一次旋转时没有被调用的问题,但是这将Date Picker的初始状态设置为当前时间。使用这个控件来设置一个持续时间到一个事件,我想让它在0小时和1分钟开始,这可以用datePicker.countDownDuration = 60来完成,但是在这之后,主要的问题又回来了。可以设置1分钟的NSDate DatePicker,但如何做到这一点?

解:

 var dateComp : NSDateComponents = NSDateComponents() dateComp.hour = 0 dateComp.minute = 1 dateComp.timeZone = NSTimeZone.systemTimeZone() var calendar : NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)! var date : NSDate = calendar.dateFromComponents(dateComp)! datePicker.setDate(date, animated: true) 

我想出了以下解决scheme,用0小时和1分钟初始化datePicker组件(在倒数计时器模式下),并在第一次旋转时直接响应。 因为这似乎是一个错误,如果你想要一个文本标签更新datePicker被改变时它的值是非常令人沮丧,它不是在第一次去:

 var dateComp : NSDateComponents = NSDateComponents() dateComp.hour = 0 dateComp.minute = 1 dateComp.timeZone = NSTimeZone.systemTimeZone() var calendar : NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)! var date : NSDate = calendar.dateFromComponents(dateComp)! datePicker.setDate(date, animated: true) 

timeZone组件并不是真的需要这个为我的实现工作。

我想你应该尝试实施这个委托

 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 

这似乎是与animation参数有关。 你只需要这一行:

 datePicker.setDate(date, animated: true) 

前一段时间,我发现了另一个类似于这个问题的问题。 这是关于从tableView:didSelectRowAtIndexPath:提出一个视图控制器tableView:didSelectRowAtIndexPath:问题是,新的控制器真正显示需要大量的时间。 其中一个解决方法是在主队列上使用dispatch_async 。 在这种情况下,我也一样。

在我的viewDidLoad ,我asynchronous地调度了主队列上的select器设置代码,在我的情况下,即使在第一次select时,它也开始响应valueChanged事件:

 DispatchQueue.main.async { self.pickerView.datePickerMode = .countDownTimer self.pickerView.minuteInterval = 5 self.pickerView.countDownDuration = 15 } 

这里是@ Henk-Martijn的解决scheme更新和简化的Swift 3

 let calendar = Calendar(identifier: .gregorian) let date = DateComponents(calendar: calendar, hour: 1, minute: 30).date! datePicker.setDate(date, animated: true) 

使用上面的代码而不是像这样的东西:

 datePicker.countDownDuration = 5_400 

我不知道我是否得到了你的问题,但dateselect器使用目标操作模式工作,并且当你改变一个值时触发这个机制。
因此,如果问题是显示的第一个值,则应将其初始化为“默认”值。