- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个带有属性的简单协议(protocol):
@protocol StopsSource <NSObject>
@property (retain,readonly) NSArray * stops;
@end
我在别处添加了一个键值观察器来监听“stops”属性的变化:
id<StopsSource> source = ...
[source addObserver:self
forKeyPath:@"stops"
options:NSKeyValueObservingOptionNew
context:nil];
代码按预期工作,因为当“stops”属性更改时我会收到 observeValueForKeyPath 事件。真正令人烦恼的是 addObserver 调用中的编译器警告:
warning: '-addObserver:forKeyPath:options:context:' not found in protocol(s)
'addObserver' 方法定义在 NSObject 的类别中:
@interface NSObject(NSKeyValueObserverRegistration)
有什么方法可以让 XCode 删除此警告?据我了解,协议(protocol)不能采用类别,所以我不确定如何将 NSKeyValueObserverRegistration 方法引入我的协议(protocol),而不是将声明复制到协议(protocol)本身,这似乎是一种 hack。
我知道这是一个微不足道的问题,因为它只是一个编译器警告,但我很想知道是否有“正确”的方法来解决这个问题。
最佳答案
The real annoyance is a compiler warning on the addObserver call:
warning: '-addObserver:forKeyPath:options:context:' not found in protocol(s)
'addObserver' 方法定义在 NSObject 的类别中:
@interface NSObject(NSKeyValueObserverRegistration)
有什么方法可以让 XCode 删除此警告?
Xcode(小写 c)只是向您显示警告;是 GCC(编译器)首先向您发出警告。
您将类 NSObject 与协议(protocol) NSObject 混淆了。 NSObject 类符合 NSObject 协议(protocol)等,但协议(protocol)本身与类没有任何关系。您的 StopsSource 协议(protocol)作为一个协议(protocol),继承自 NSObject 协议(protocol),而不是 NSObject 类。
您的声明只涵盖这两个协议(protocol),而不是任何特定的类,因此它不包含 NSObject 类可能实现的那些协议(protocol)之外的任何内容(例如 KVO)。这就是您收到警告的原因。
正如 Jason Coco 在他对你的问题的评论中告诉你的那样,解决方案是更改声明以使用 NSObject 类加上你的协议(protocol):
NSObject <StopsSource> *source = …;
关于objective-c - 协议(protocol)对象 : Compiler Warnings on addObserver: 上的键值观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/741134/
我有以下代码: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillEnt
我从mockito开始,想知道如何假装添加观察者。我想编写一个测试来确保观察者计数在函数调用后增加。 示例测试代码: MyClassUnderTest instance = new MyClassUn
在我的应用程序(游戏)中,当按下中心/主页或锁定按钮时,我试图使用 NSNotificationCenter 暂停和恢复游戏。这是我正在使用的代码: [[NSNotificationCenter de
我尝试使用 NotificationCenter.addObserver(...) 打开本地通知时启用进入特定 View 的功能 我的代码是 override func viewDidLoad() {
在 XCode 5.1(和 CorePlot 1.4)之前,有两个对象可以正常接收 NSNotifications。但是,对于 XCode 5.1.1 (Coreplot 1.5),我发现如果 add
我目前正在为大学开发一款小游戏。我有一个扩展 Observable 并实现接口(interface)的模型。 由于接口(interface)的原因,我每次都必须为我添加的每个观察者重写 addObse
我有多种操作(派生自 NSOperation)通过 Internet 进行异步查询。按照惯例,我通过观察它们的 isFinished 属性来确定它们何时完成。 当一个特定类型的操作完成时,我想使用第一
我正在尝试获取 AVPlayer timedMetadata,但永远不会调用观察者 self.metaItem!.addObserver(self, forKeyPath: "metaData", o
我需要使用 NSNotificationCenter 在新数据来自 WCSession 时更新我,以便我可以填写我的 tableview。 我在列出的每个函数上都设置了断点,但出于某种原因,它直接转到
根据我的理解,addObserver 方法的 object 参数是您要从中接收通知的对象。大多数时候,我将其视为 nil(我假设这是因为所有对象都需要指定类型的通知)。在我的特殊情况下,我在屏幕顶部和
大家好多年阅读 StackOverflow,现在我决定加入。我正在努力解决这个问题: 我有一个“Depot”实体,它有两个对多关系“Persons”和“Trucks”。我想观察在给定“Depot”对象
每当我的 UILabel 中的文本发生更改时,我都会尝试获取通知,以便我可以调整它的大小以适应新文本。这是我的代码: public class MessageContainer : UILabel {
我看过NSNotification addObserver/removeObserver 放在viewDidLoad/viewDidUnload , viewDidAppear/viewDidDisa
所以我有一个像public class Main Implements Observer{}这样声明的函数,里面有主函数public static void main(String[] args) {
我正在尝试创建让我的 View 在键盘打开后移动。但我遇到了一个非常意想不到的问题。 这是我的代码: override func viewDidLoad() { super.viewDidLo
我正在尝试从位置管理器对象向我的 viewController 发出通知。它不起作用 - addObserver 方法中的选择器未被调用。 位置管理器 Object.m 文件(具有标准分派(dispa
有没有办法获取在 NSManagedObject 上使用 addObserver:forKeyPath:options:context: 和选项 NSKeyValueChangeInsertion 添
如何在 SwiftUI 中添加 NotificationCenter.default.addObserve? 当我尝试添加观察者时出现以下错误 Argument of '#selector' refe
我已经看到如何从一些 NotificationCenter 代码使用 Publisher 过渡到 Combine,但还没有看到如何为类似的东西做到这一点: NotificationCe
我习惯于在初始化方法中加入“[NSNotificationCenter defaultCenter] addObserver”。而且我已经看到很多其他人放在 viewDidLoad 中。是否有任何说明
我是一名优秀的程序员,十分优秀!