Ios FCNDEFMessage QueryDefStatusWithCompletionHandler::发送到实例的选择器无法识别
我正在尝试获取有关NFC标记的一些信息,会话成功启动,读取标记后,我们跳转到以下函数:Ios FCNDEFMessage QueryDefStatusWithCompletionHandler::发送到实例的选择器无法识别,ios,objective-c,nfc,phonegap,Ios,Objective C,Nfc,Phonegap,我正在尝试获取有关NFC标记的一些信息,会话成功启动,读取标记后,我们跳转到以下函数: - (void) readerSession:(NFCNDEFReaderSession *)session didDetectNDEFs:(NSArray<NSObject<NFCNDEFTag> * > *)tags { NSLog(@"NFCNDEFReaderSession didDetectNDEFs"); for (NSObject<NFCNDEFT
- (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");
}
}];
}
}
注意:NFCNDEFTag是一个协议,所以它可能与我声明它的方式有关:NSObject
?让我们看看的文档
你有:
- (void)readerSession:(NFCNDEFReaderSession *)session
didDetectNDEFs:(NSArray<NFCNDEFMessage *> *)messages;
-(void)readerSession:(NFCNDEFReaderSession*)会话
DidDetectDefs:(NSArray*)消息;
及
-(void)readerSession:(NFCNDEFReaderSession*)会话
didDetectTags:(NSArray*)标签;
你写道:
- (void)readerSession:(NFCNDEFReaderSession *)session
didDetectNDEFs:(NSArray<NSObject<NFCNDEFTag> * > *)tags {
-(void)readerSession:(NFCNDEFReaderSession*)会话
DidDetectDefs:(NSArray*)标记{
这是两者的混合
但在Objective-C中,选择器将是:
readerSession:DidDetectDefs
&readerSession:didDetectTags:
用于官方版本,而您的是readerSession:DidDetectDefs
,与第一个版本相同。因此,您为自己的版本引入了编译器和运行时
但它不关心参数的类型,因此它不是正确的对象,因此它没有实现方法queryDefStatusWithCompletionHandler:
,因此它会崩溃并显示错误消息
如何修复它
实现真正的委托方法,使用好的参数类型,使用正确的方法,你不能像那样修改它们。真正的方法是
-(void)readerSession:(NFCNDEFReaderSession*)session didDetectDefs:(NSArray*)messages;
,您有一个NFCNDEFMessage
数组,而不是NFCNDEFTag
。除非您在其上添加了一个扩展以符合NFCNDEFTag
,但情况似乎并非如此。谁确切地符合NFCNDEFTag
标准?因为我准备写入标记,我需要获取标记的对象itself、 我查看了定义,发现这个-(void)readerSession:(NFCNDEFReaderSession*)session didDetectTags:(NSArray*)标记API_可用(ios(13.0))API_不可用(watchos、macos、tvos);
并且函数本身实际上正在工作,甚至是for循环。这个问题与NFCNDEFTag有关
- (void)readerSession:(NFCNDEFReaderSession *)session
didDetectTags:(NSArray<__kindof id<NFCNDEFTag>> *)tags;
- (void)readerSession:(NFCNDEFReaderSession *)session
didDetectNDEFs:(NSArray<NSObject<NFCNDEFTag> * > *)tags {