FCNDEFMessage queryNDEFStatusWithCompletionHandler:]: 无法识别的选择器发送到实例
FCNDEFMessage queryNDEFStatusWithCompletionHandler:]: unrecognized selector sent to instance
我正在尝试获取有关 NFC 标签的一些信息,会话成功启动并在读取标签后,我们跳转到以下函数:
- (void) readerSession:(NFCNDEFReaderSession *)session didDetectNDEFs:(NSArray<NSObject<NFCNDEFTag> * > *)tags {
NSLog(@"NFCNDEFReaderSession didDetectNDEFs");
for (NSObject<NFCNDEFTag> *tag in tags) {
[tag queryNDEFStatusWithCompletionHandler:^(NFCNDEFStatus status, NSUInteger capacity, NSError * _Nullable error) {
if (!error) {
NSLog(@"success");
}
}];
}
}
我们甚至在循环中进行了一次迭代,但就在我尝试获取有关我的标签的一些信息时,应用程序崩溃并显示以下错误消息:
019-11-06 16:01:12.955810+0100 MyApp[336:10691] -[NFCNDEFMessage queryNDEFStatusWithCompletionHandler:]: unrecognized selector sent to instance 0x281cfce30
2019-11-06 16:01:12.956200+0100 MyApp[336:10691] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NFCNDEFMessage queryNDEFStatusWithCompletionHandler:]: unrecognized selector sent to instance 0x281cfce30'
*** First throw call stack:
(0x18e45180c 0x18e179fa4 0x18e35536c 0x18e455c88 0x18e457a6c 0x100636cc0 0x100b097fc 0x100b0abd8 0x100b11b48 0x100b12718 0x100b1dadc 0x18e16ef88 0x18e171ad4)
libc++abi.dylib: terminating with uncaught exception of type NSException
注意: NFCNDEFTag 是一个协议,所以它可能与我声明它的方式有关:NSObject<NFCNDEFTag>
?
让我们看看NFCNDEFReaderSessionDelegate
的文档。
您有:
- (void)readerSession:(NFCNDEFReaderSession *)session
didDetectNDEFs:(NSArray<NFCNDEFMessage *> *)messages;
和
- (void)readerSession:(NFCNDEFReaderSession *)session
didDetectTags:(NSArray<__kindof id<NFCNDEFTag>> *)tags;
您写道:
- (void)readerSession:(NFCNDEFReaderSession *)session
didDetectNDEFs:(NSArray<NSObject<NFCNDEFTag> * > *)tags {
两者兼而有之。
但在 Objective-C 中,选择器将是:
readerSession:didDetectNDEFs
&readerSession:didDetectTags:
是官方的,你的是readerSession:didDetectNDEFs
,和第一个一样。所以你为你的编译器和运行时引诱了。
但它不关心参数的类型,所以它不是正确的对象,所以它没有实现方法 queryNDEFStatusWithCompletionHandler:
,因此它崩溃并显示该错误消息。
如何解决?
实现真正的委托方法,参数类型要好,用对了,不能随便修改。
我正在尝试获取有关 NFC 标签的一些信息,会话成功启动并在读取标签后,我们跳转到以下函数:
- (void) readerSession:(NFCNDEFReaderSession *)session didDetectNDEFs:(NSArray<NSObject<NFCNDEFTag> * > *)tags {
NSLog(@"NFCNDEFReaderSession didDetectNDEFs");
for (NSObject<NFCNDEFTag> *tag in tags) {
[tag queryNDEFStatusWithCompletionHandler:^(NFCNDEFStatus status, NSUInteger capacity, NSError * _Nullable error) {
if (!error) {
NSLog(@"success");
}
}];
}
}
我们甚至在循环中进行了一次迭代,但就在我尝试获取有关我的标签的一些信息时,应用程序崩溃并显示以下错误消息:
019-11-06 16:01:12.955810+0100 MyApp[336:10691] -[NFCNDEFMessage queryNDEFStatusWithCompletionHandler:]: unrecognized selector sent to instance 0x281cfce30
2019-11-06 16:01:12.956200+0100 MyApp[336:10691] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NFCNDEFMessage queryNDEFStatusWithCompletionHandler:]: unrecognized selector sent to instance 0x281cfce30'
*** First throw call stack:
(0x18e45180c 0x18e179fa4 0x18e35536c 0x18e455c88 0x18e457a6c 0x100636cc0 0x100b097fc 0x100b0abd8 0x100b11b48 0x100b12718 0x100b1dadc 0x18e16ef88 0x18e171ad4)
libc++abi.dylib: terminating with uncaught exception of type NSException
注意: NFCNDEFTag 是一个协议,所以它可能与我声明它的方式有关:NSObject<NFCNDEFTag>
?
让我们看看NFCNDEFReaderSessionDelegate
的文档。
您有:
- (void)readerSession:(NFCNDEFReaderSession *)session
didDetectNDEFs:(NSArray<NFCNDEFMessage *> *)messages;
和
- (void)readerSession:(NFCNDEFReaderSession *)session
didDetectTags:(NSArray<__kindof id<NFCNDEFTag>> *)tags;
您写道:
- (void)readerSession:(NFCNDEFReaderSession *)session
didDetectNDEFs:(NSArray<NSObject<NFCNDEFTag> * > *)tags {
两者兼而有之。
但在 Objective-C 中,选择器将是:
readerSession:didDetectNDEFs
&readerSession:didDetectTags:
是官方的,你的是readerSession:didDetectNDEFs
,和第一个一样。所以你为你的编译器和运行时引诱了。
但它不关心参数的类型,所以它不是正确的对象,所以它没有实现方法 queryNDEFStatusWithCompletionHandler:
,因此它崩溃并显示该错误消息。
如何解决?
实现真正的委托方法,参数类型要好,用对了,不能随便修改。