45

我注意到没有代表来观察 UIDatePicker 的变化。有没有一种方法可以在不确认任何内容的情况下检测选择器何时发生更改,例如它旋转并落在一个新数字上的那一刻,我希望能够检测到这一点。我考虑过键值观察,但我认为没有一个属性会当场发生变化

4

4 回答 4

69

您需要将UIControlEventValueChanged事件添加到您的 UIDatePicker 以处理日期更改:

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

然后实现:

- (void)dateIsChanged:(id)sender{
     NSLog(@"Date changed");
}
于 2012-08-08T14:38:08.827 回答
45

转到 IB 并从UIDatePicker.h 文件中拖动。然后选择在此处输入图像描述

在 .m 文件中随心所欲地处理它;XCode 将为您添加以下方法。

在此处输入图像描述

于 2012-08-08T14:39:16.843 回答
9

斯威夫特 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)
    }
}
于 2019-03-27T13:28:58.197 回答
2

这是一个符合 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
于 2014-02-27T08:21:38.393 回答