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器使用目标操作模式工作,并且当你改变一个值时触发这个机制。
因此,如果问题是显示的第一个值,则应将其初始化为“默认”值。