【发布时间】:2012-08-05 16:37:19
【问题描述】:
我注意到没有委托来观察 UIDatePicker 的变化。有没有一种方法可以在不确认任何内容的情况下检测选择器何时发生更改,例如它旋转并落在一个新数字上的那一刻,我希望能够检测到这一点。我想过观察键值,但我不认为有一个属性会在现场发生变化
【问题讨论】:
标签: objective-c ios uidatepicker key-value-observing
我注意到没有委托来观察 UIDatePicker 的变化。有没有一种方法可以在不确认任何内容的情况下检测选择器何时发生更改,例如它旋转并落在一个新数字上的那一刻,我希望能够检测到这一点。我想过观察键值,但我不认为有一个属性会在现场发生变化
【问题讨论】:
标签: objective-c ios uidatepicker key-value-observing
您需要将UIControlEventValueChanged 事件添加到您的UIDatePicker 以处理日期更改:
[myDatePicker addTarget:self action:@selector(dateIsChanged:) forControlEvents:UIControlEventValueChanged];
然后执行:
- (void)dateIsChanged:(id)sender{
NSLog(@"Date changed");
}
【讨论】:
picker.addTarget(self, action: #selector(dateChanged), forControlEvents: .ValueChanged) @objc func dateChanged(sender: UIDatePicker) { print(sender.date.description) }
转到 IB 并从 UIDatePicker 拖到您的 .h 文件中。然后选择
在 .m 文件中随心所欲地处理它; XCode 会为你添加下面的方法。
【讨论】:
斯威夫特 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)
}
}
【讨论】:
这是一个符合 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
【讨论】: