FCNDEFMessage queryNDEFStatusWithCompletionHandler:]: нераспознанный селектор, отправленный экземпляру - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь получить некоторую информацию о теге 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>?

1 Ответ

1 голос
/ 06 ноября 2019

Давайте посмотрим документ 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:, поэтомуон вылетает с этим сообщением об ошибке.

Как это исправить?

Реализуйте методы реального делегата, с хорошими типами параметров, используйте правильный, вы не можете их так изменить, какты хочешь.

...