在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?,kvoContext: KVOContext)
使用Swift不使用指针,我不知道如何取消引用使用第一种方法的指针。
如果我创建自己的KVOContext常数与第二种方法一起使用,我结束了它要求:
let test:KVOContext = KVOContext.fromVoidContext(context: CMutableVoidPointer)
编辑:CMutableVoidPointer和KVOContext有什么区别?有人可以给我一个例子,如何使用它们,当我使用一个在另一个?
编辑#2:苹果公司的开发者刚刚发布到论坛:KVOContext正在消失;使用全局参考作为您的上下文是现在的方式。
现在KVOContext已经在Xcode 6 beta 3中,您可以执行以下操作。定义全局(即不是类属性),如下所示:
原文链接:https://www.f2er.com/swift/320549.htmllet 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) } }