Observing change in UIDatePicker

I noticed that there is no delegate to observe changes in UIDatePicker. Is there a way to detect when a change is made in the picker without confirming anything, like the moment it spins and lands on a new number I want to be able to detect that. I thought about key value observing, but I don't think there's a property that changes on the spot

4 Answers

You need to add to your UIDatePicker the UIControlEventValueChanged event to handle date changes:

[myDatePicker addTarget:self action:@selector(dateIsChanged:) forControlEvents:UIControlEventValueChanged];

Then the implementation:

- (void)dateIsChanged:(id)sender{ NSLog(@"Date changed");
}
2

Go to IB and drag from the UIDatePicker to your .h file. Then selectenter image description here

Handle this however you want in your .m file; XCode will add the method below for you.

enter image description here

1

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

Here is a proposal for a KVO-compliant date picker:

@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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like