FCNDEFMessage queryNDEFStatusWithCompletionHandler:]:无法识别的选择器已发送到实例

问题描述 投票:0回答:1

我正在尝试获取有关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>

ios objective-c nfc phonegap
1个回答
1
投票

让我们看一下NFCNDEFReaderSessionDelegate的文档。

您有:

NFCNDEFReaderSessionDelegate

- (void)readerSession:(NFCNDEFReaderSession *)session 
       didDetectNDEFs:(NSArray<NFCNDEFMessage *> *)messages;

您写道:

- (void)readerSession:(NFCNDEFReaderSession *)session 
        didDetectTags:(NSArray<__kindof id<NFCNDEFTag>> *)tags;

两者兼而有之。

但是在Objective-C中,选择器将是:正式版- (void)readerSession:(NFCNDEFReaderSession *)session didDetectNDEFs:(NSArray<NSObject<NFCNDEFTag> * > *)tags { readerSession:didDetectNDEFs,您的是readerSession:didDetectTags:,与第一个相同。因此,您吸引了您的编译器和运行时。

但是它并不关心参数的类型,因此它不是正确的对象,因此它没有实现方法readerSession:didDetectNDEFs,因此会因该错误消息而崩溃。

如何解决?

使用良好的参数类型来实现真正的委托方法,请使用正确的参数类型,您无法根据需要修改它们。

© www.soinside.com 2019 - 2024. All rights reserved.