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

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

【问题讨论】:

    标签: objective-c ios uidatepicker key-value-observing


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-09
        • 2018-02-26
        • 2015-09-13
        • 1970-01-01
        • 2020-07-29
        • 2021-08-30
        • 2018-12-12
        • 2021-05-03
        相关资源
        最近更新 更多