J'ai remarqué qu'il n'y a pas de délégué pour observer les changements dans UIDatePicker. Existe-t-il un moyen de détecter lorsqu'un changement est effectué dans le sélecteur sans confirmer quoi que ce soit, comme le moment où il tourne et atterrit sur un nouveau numéro, je veux pouvoir le détecter. J'ai pensé à l'observation des valeurs clés, mais je ne pense pas qu'il y ait une propriété qui change sur place
Accédez à IB et faites-le glisser du UIDatePicker
vers votre fichier .h. Sélectionnez ensuite
Gérez cela comme vous le souhaitez dans votre fichier .m; XCode ajoutera la méthode ci-dessous pour vous.
Vous devez ajouter à votre UIDatePicker l'événement UIControlEventValueChanged
pour gérer les changements de date:
[myDatePicker addTarget:self action:@selector(dateIsChanged:) forControlEvents:UIControlEventValueChanged];
Ensuite l'implémentation:
- (void)dateIsChanged:(id)sender{
NSLog(@"Date changed");
}
Voici une proposition pour un sélecteur de date compatible KVO:
@interface LNKVODatePicker : UIDatePicker
@end
@implementation LNKVODatePicker
- (void)willMoveToWindow:(UIWindow *)newWindow
{
[super willMoveToWindow:newWindow];
[self removeTarget:self action:@selector(_didChangeDate) forControlEvents:UIControlEventValueChanged];
if(newWindow != nil)
{
[self addTarget:self action:@selector(_didChangeDate) forControlEvents:UIControlEventValueChanged];
}
}
- (void)dealloc
{
[self removeTarget:self action:@selector(_didChangeDate) forControlEvents:UIControlEventValueChanged];
}
- (void)_didChangeDate
{
[self willChangeValueForKey:@"date"];
[self didChangeValueForKey:@"date"];
}
@end
Swift 4.2 | Xcode 10.1
@objc func handleDatePicker(_ datePicker: UIDatePicker) {
textField.text = datePicker.date.formatted
}
override func viewDidLoad() {
super.viewDidLoad()
datePicker.addTarget(self, action: #selector(handleDatePicker), for: .valueChanged)
}
extension Date {
static let formatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "EEEE, dd MMM yyyy HH:mm:ss Z"
return formatter
}()
var formatted: String {
return Date.formatter.string(from: self)
}
}