Я заметил, что делегат не видит изменений в UIDatePicker. Есть ли способ обнаружить, когда изменения сделаны в сборщике без подтверждения чего-либо, например, когда он вращается и приземляется на новый номер, я хочу это обнаружить. Я думал о наблюдении за ключевыми значениями, но я не думаю, что есть свойство, которое меняется на месте.
Наблюдение за изменением в UIDatePicker
Ответ 1
Перейдите к IB и перетащите его из UIDatePicker
в ваш .h файл. Затем выберите
Обработайте это, но вы хотите в своем .m файле; XCode добавит метод ниже для вас.
Ответ 2
Вам нужно добавить в UIDatePicker событие UIControlEventValueChanged
для обработки изменений даты:
[myDatePicker addTarget:self action:@selector(dateIsChanged:) forControlEvents:UIControlEventValueChanged];
Тогда реализация:
- (void)dateIsChanged:(id)sender{
NSLog(@"Date changed");
}
Ответ 3
Вот предложение для выбора даты, соответствующего 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
Ответ 4
Xcode 9 • Swift 4
@objc func handleDatePicker(_ datePicker: UIDatePicker) {
textField3.text = datePicker.date.formatted
}
override func viewDidLoad() {
super.viewDidLoad()
datePicker.addTarget(self, action: #selector(handleDatePicker), forControlEvents: .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)
}
}