web-dev-qa-db-fra.com

Observer le changement dans UIDatePicker

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

37
Chris

Accédez à IB et faites-le glisser du UIDatePicker vers votre fichier .h. Sélectionnez ensuiteenter image description here

Gérez cela comme vous le souhaitez dans votre fichier .m; XCode ajoutera la méthode ci-dessous pour vous.

enter image description here

42
Dustin

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");
}
66
chroman

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
2
Leo Natan

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)
    }
}
1
Argus