美文网首页
Swift-KVO的简化用法

Swift-KVO的简化用法

作者: 查理布朗Bio | 来源:发表于2023-04-02 17:17 被阅读0次

    前言

    NSKeyValueObserving(KVO),一个非正式协议,用来通知指定对象的属性发生更改,该协议基本适用于大部分的控件

    具体步骤

    • 构建观察者对象
      在控制器的生命周期内,创建一个对象来接收事件

      注意必须创建一个观察事件对象,否则会在创建好观察事件后直接释放;
      在控制器中不再需要单独释放该观察事件,该事件会在控制器销毁的观察事件对象时自动释放,相对的,你也可以提前将观察对象置空,从而提前释放观察事件

    • 选择需要观察的参数类型
      keyPath针对不同的控件会有不同的对象,我们可以通过xcode编译器提示来选择对应的参数类型,这里我们用UIView视图控件来举例说明

    可以看到这里涵盖了UIView的成员变量

    • 选择观察对象的状态变更发送时机
      NSKeyValueObservingOptions
      .prior - 发生改变前
      .old - 发生改变时,用于获取改变前的旧值
      .new - 发生改变时,用于获取改变后的新值
      .initial - 观察者注册返回之前,用于获取初始值
    • 处理反馈结果
      NSKeyValueObservedChange
      isPrior - 是否发生改变前
      newValue - 新值
      oldValue - 旧值

    这里的value使用泛型,会根据具体的类型匹配对应的类型值,无需手动进行类型转换

    实际应用

    • UITextField
    var textfield = UITextField()
    var observation: NSKeyValueObservation?
    func createObserver() {
        observation = observe(\.isEditing, options: [.new]) { uitextfield, change in
            let prior = change.isPrior
            let oldBool = change.oldValue
            let newBool = change.newValue
        }
    }
    
    func removeObserver() {
        observation = nil
    }
    
    • UIView
    var vview = UIView()
    var observation: NSKeyValueObservation?
    func createObserver() {
        observation = vview.observe(\.frame, options: [.new]) { uiview, change in
            let prior = change.isPrior
            let oldRect = change.oldValue
            let newRect = change.newValue
        }
    }
    
    • UIViewController
    var vc = UIViewController()
    var observation: NSKeyValueObservation?
    func createObserver() {
        observation = vc.observe(\.view.bounds, options: [.new]) { viewcontroller, change in
            let prior = change.isPrior
            let oldRect = change.oldValue
            let newRect = change.newValue
        }
    }
    

    相关文章

      网友评论

          本文标题:Swift-KVO的简化用法

          本文链接:https://www.haomeiwen.com/subject/oqtrddtx.html