当前位置: 首页 > 面试题库 >

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

宓昂雄
2023-03-14
问题内容

在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)
    }
}


 类似资料:
  • 问题内容: 如果是这样,那么在Objective-C中使用键值观察时是否没有其他键差异? 问题答案: (编辑以添加新信息):考虑使用Combine框架是否可以帮助您完成所需的工作,而不是使用KVO 是的,没有。KVO一直以来都在处理NSObject子类。它不适用于不继承NSObject的类。斯威夫特(目前至少)没有自己的原生观察系统。 (有关如何将其他属性公开为ObjC的信息,请参见注释,以便KV

  • 键值观察 - KVO 在 KVO 里,对象可以注册监听任何属性的变化,不管它是否持有。如果感兴趣的话,可以读一读苹果 KVO 编程指南。 如何使用 KVO 正如前面所提及的, 对象可以关注任何属性的变化。在我们的例子里,我们可以用 KVO 关注 UIImageView 的 image 属性变化。 打开 AlbumView.swift 文件,找到 init(frame:albumCover:) 方法

  • 问题内容: 如果我这样存储观察者: 一旦不再需要我该如何删除/禁用/清理? 我的实例没有接收到实例的任何类似方法,本身也没有任何类似的方法。 问题答案: 在iOS 11中,您不必这样做。只是让观察者超出范围即可。让观察者在观察者之前死亡或让被观察者在观察者之前死亡不再有任何惩罚,因此您没有实际工作要做。 另一方面,如果您确实 要 注销观察者,则将其从保留它的内容中删除,或告诉它。(某些东西必须保留

  • 问题内容: 我正在尝试在Swift中使用C库,并且在调用任何将函数指针作为参数之一的函数时遇到麻烦。例如,我要在Swift中使用的lua.h文件的一部分看起来像这样: 我使用桥接头来访问库,并且从我的Swift代码中,我可以毫无困难地调用 lua_setuservalue 。但是,如果我尝试调用 lua_callk,则会 收到“使用未解析的标识符’lua_callk’”的信息。如果我从 lua_c

  • 问题内容: 回答“ 我如何知道数组内元素的值是否已更改”这一问题时受到启发 ,答案是使用 属性观察 器检查数组是否已被修改。 但是,如何确定属性查看器中集合类型中的已更新元素是什么?例如: 请注意,每次添加,更新或删除操作都已调用该代码,但是我如何才能确切知道受影响的元素是什么?有没有办法通过将数组除以 Property Observer 来实现这一目标? 我问的是Swift中的所有集合类型,因为

  • 我对rxjava还是个新手,刚刚开始学习它,并将我们的android项目转换为RX。所以我编写了Observable并使用flatmaps将它们链接起来,以调用API并返回一个Observable。现在,在主活动中,我订阅它们,并将我的UI代码添加到onNext、onSubscribe、onComplete和onError(如果适用)中。但是我有多个api,我为每个api都创建了一个observa