观察 UIDatePicker 的变化

Posted

技术标签:

【中文标题】观察 UIDatePicker 的变化【英文标题】:Observing change in UIDatePicker 【发布时间】:2012-08-05 16:37:19 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

然后执行:

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

【讨论】:

很好的答案,我对这个程序化的东西太懒了。请注意,您需要引用日期选择器来执行此操作,如果您在 IB 中创建它,则不一定有(尽管您可以轻松添加它)。 Swift 版本:picker.addTarget(self, action: #selector(dateChanged), forControlEvents: .ValueChanged) @objc func dateChanged(sender: UIDatePicker) print(sender.date.description) 【参考方案2】:

转到 IB 并从 UIDatePicker 拖到您的 .h 文件中。然后选择

在 .m 文件中随心所欲地处理它; XCode 会为你添加下面的方法。

【讨论】:

当然它是我什至没有考虑过的最简单的解决方案。谢谢大佬【参考方案3】:

斯威夫特 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)
    

【讨论】:

【参考方案4】:

这是一个符合 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

【讨论】:

以上是关于观察 UIDatePicker 的变化的主要内容,如果未能解决你的问题,请参考以下文章

有人发现 UIDatePicker 在 iOS 14 下被破坏了吗?

属性观察者(监听属性的变化)

NSDate和NSString的转换及判定是昨天,今天,明天

如何观察所有对象属性的变化?

ngFor正在根据可观察变量的变化重新渲染内容

Rxjs 观察对象更新和变化