在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即将消失;现在使用全局引用作为您的上下文。
现在,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) } }