Подтвердить что ты не робот

Наблюдение за изменением в UIDatePicker

Я заметил, что делегат не видит изменений в UIDatePicker. Есть ли способ обнаружить, когда изменения сделаны в сборщике без подтверждения чего-либо, например, когда он вращается и приземляется на новый номер, я хочу это обнаружить. Я думал о наблюдении за ключевыми значениями, но я не думаю, что есть свойство, которое меняется на месте.

4b9b3361

Ответ 1

Перейдите к IB и перетащите его из UIDatePicker в ваш .h файл. Затем выберите enter image description here

Обработайте это, но вы хотите в своем .m файле; XCode добавит метод ниже для вас.

enter image description here

Ответ 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)
    }
}