一尘不染

使用Swift添加不带指针的KVO观察器

swift

在Objective-C中,我通常会使用以下内容:

static NSString *kViewTransformChanged = @"view transform changed";
// or
static const void *kViewTransformChanged = &kViewTransformChanged;

[clearContentView addObserver:self
                       forKeyPath:@"transform"
                          options:NSKeyValueObservingOptionNew
                          context:&kViewTransformChanged];

我有两种重载方法可供选择,以添加KVO观察者,唯一的区别是上下文参数:

 clearContentView.addObserver(observer: NSObject?, forKeyPath: String?, options: NSKeyValueObservingOptions, context: CMutableVoidPointer)
 clearContentView.addObserver(observer: NSObject?, forKeyPath: String?, options: NSKeyValueObservingOptions, kvoContext: KVOContext)

在Swift不使用指针的情况下,我不确定如何取消引用指针以使用第一种方法。

如果我创建自己的KVOContext常量以与第二种方法一起使用,那么我最终会要求这样做:

let test:KVOContext = KVOContext.fromVoidContext(context: CMutableVoidPointer)

编辑:CMutableVoidPointer和KVOContext之间有什么区别?谁能给我一个例子,说明如何同时使用它们以及何时使用它们?

编辑2:Apple的一名开发人员刚刚将其发布到了论坛上:KVOContext即将消失;现在使用全局引用作为您的上下文。


阅读 230

收藏
2020-07-07

共1个答案

一尘不染

现在,Xcode 6 beta 3中已经没有了KVOContext,您可以执行以下操作。定义一个全局(即不是类属性),如下所示:

let myContext = UnsafePointer<()>()

添加观察者:

observee.addObserver(observer, forKeyPath: …, options: nil, context: myContext)

在观察者中:

override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: [NSObject : AnyObject]!, context: UnsafePointer<()>) {
    if context == myContext {
        …
    } else {
        super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
    }
}
2020-07-07