Передайте обработчик завершения объектива c в swift - PullRequest
0 голосов
/ 26 февраля 2020

Использование ios pushkit didReceiveIncomingPushWithPayload; Вызовите и передайте несколько параметров, включая withCompletionHandler. Как бы выглядел вызов функции, интерфейс и быстрые аргументы с withCompletionHandler?

AppDelegate.m

- (void)pushRegistry:(PKPushRegistry *)registry
  didReceiveIncomingPushWithPayload:(PKPushPayload *)payload
             forType:(PKPushType)type
  withCompletionHandler:(void (^)(void))completion{
  NSLog(@"VHC: AppDelegate - didReceiveIncomingPushWithPayload hit!");
  Voip* instance = [Voip new];
  [instance handleIncomingPush:payload forType:type withCompletionHandler:completion];
}

Voip.h

-(void)handleIncomingPush: (PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void (^)(void))completion;

Voip.swift

 @objc(handleIncomingPush: : :)
  func handleIncomingPush(_ payload: PKPushPayload, forType: PKPushType, withCompletionHandler: @escaping () -> Void) {
    withCompletionHandler()
}

Ошибка

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Voip handleIncomingPush:forType:withCompletionHandler:]: unrecognized selector sent to instance 0x2806f4f30'

1 Ответ

1 голос
/ 26 февраля 2020

Пара наблюдений:

  1. То, что @objc имя метода неверно. Учитывая, что ваша сигнатура метода Swift соответствует тому, что вы ищете в своем коде Objective- C, вы можете просто удалить имя метода вручную:

    class Voip: NSObject {
        @objc func handleIncomingPush(_ payload: PKPushPayload, forType: PKPushType, withCompletionHandler: @escaping () -> Void) {
            withCompletionHandler()
        }
    }
    

    Или, лично, я бы использовал Swiftier подпись метода и объявите интерфейс Obj C, если хотите:

    class Voip: NSObject {
        @objc(handleIncomingPush:forType:withCompletionHandler:)
        func handleIncomingPush(_ payload: PKPushPayload, type: PKPushType, completionHandler: @escaping () -> Void) {
            completionHandler()
        }
    }
    
  2. Удалите заголовок Voip.h. Всегда просто используйте «Сгенерированный заголовочный файл интерфейса Objective- C».

  3. Вместо импорта Voip.h в коде Objective- C, импортируйте сгенерированный заголовок интерфейса. Например, если ваше приложение называется MyApp, то оно, вероятно, просто:

    #import <MyApp-Swift.h>
    

    Посмотрите в настройках вашей цели параметр «Objective- C Generated Interface Header File», если вам не ясно, что зовут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...