目标C:UIDatePicker UIControlEventValueChanged仅在第二次select时触发

第一次使用UIDatePickers。 首先,我只是试图用datePicker(在倒计数模式下设置)中select的任何值来更新文本字段。

它的工作,但只有第二次,用户select一个时间。 我的行动,durationSelected()只是第二次调用,所以更新textField没有问题。

以下是我在故事板中configurationdateselect器的方法:

在这里输入图像说明

在这里输入图像说明

以下是Value Changed引发的操作:

从DetailViewController.m

- (IBAction)durationSelected:(UIDatePicker *)sender { self.durationTextField.text = [NSString stringWithFormat:@"%f seconds", sender.countDownDuration]; } 

我已经尝试设置一个默认值,这没有任何作用。

任何关于发生了什么的想法?

谢谢!

这似乎是UIDatePicker的iOS 7实施中的一个错误。 我build议提交一个雷达。

在iOS 6 SDK上构build并在iOS 6设备上运行将会工作,而在iOS 7设备上运行则不会。

您可以通过将这行代码添加到- (void)viewDidLoad方法来修复它

 [self.datePicker setDate:[NSDate date] animated:YES]; 

在UIDatePickerModeCountDownTimer模式下使用时,我看到了与iOS 7.0.3 UIDatePicker类似的错误。 当用户一次通过滚动轮子来改变值时,select器不会触发与UIControlEventValueChanged事件相关联的目标动作。 它适用于后续更改。

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

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

我不确定,这是一个有教养的猜测:

可能iOS只在跟踪date选取器的值更改时,才会由animation轮引起。 所以它会在您的第一个“滚动”上设置值,但只能检测到第二个已经改变的值。

正如我所说,我不能确定的原因,但修复应该是简单的:只需设置凝视date以编程方式在视图加载后使用setDate: animated: ::

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self.picker setDate:[NSDate dateWithTimeIntervalSinceNow:0] animated:true ]; } 

这似乎是为我工作。

你可以尝试设置countDownTimer的值(如果你正在使用datepicker在倒计时器模式)。 但是请确保在提交select器后在完成块内设置此属性。