ios - 属性上的 Swift 扩展事件监听器

标签 ios swift properties uikit

我想知道是否可以通过 extension 在 Swift 中编辑 properties

我想做这样的事情。

extension UIGestureRecognizer {
    var state: UIGestureRecognizerState {
       didSet(state) {
             self.stateChanged(state)
       }
}

最佳答案

您不能更改UIGestureRecognizerstate 属性的实现。如果您可以公开获取和设置 state,那么您可以创建一个不同的计算属性 myState,将获取和设置转发给 state。不幸的是你不能。但是,您可以使用 KVO ( Key Value Observing) 来解决这个问题。

首先,我们创建一个对象来响应我们手势的 KVO 通知并实现 observeValueForKeyPath,它在 state 属性被调用时被调用。

class StateObserver : NSObject {
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if let gesture = object as? UIGestureRecognizer {
            gesture.stateChanged(gesture.state)
        }
    }
}

其次,注册一个 StateObserver 实例,以便在 tap.state 更改时收到通知。

let stateObserver = StateObserver()
let tap = UITapGestureRecognizer()
tap.addObserver(stateObserver, forKeyPath: "state", options: [.New, .Old], context: nil)

第三,不要忘记在完成后注销 StateObserver

tap.removeObserver(stateObserver, forKeyPath: "state'")

关于ios - 属性上的 Swift 扩展事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36315471/

相关文章:

ios - 无法在日历中添加事件

ios - Xcode:使用 pod 依赖项创建框架

c# - 非静态字段、方法或属性需要对象引用?

java - 通过覆盖属性文件来保存状态

properties - 如何将 QML 项目分配给 QML 中的组件属性,然后在组件内使用该对象?

javascript - 如何获取ios中UIWebview中的内容

iphone - OpenGL ES 2.0 中的地球日/夜侧着色器

ios - UITableView 单元格不显示删除菜单

json - Swift:HTTP 加载失败(错误代码:100)

swift - 关闭 RestKit Swift 中的 WAL 文件模式