NotificationCenter не получает триггер в моем объектном классе (использует класс или класс объекта).Не контролер представления - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть один класс obj c, файл swift.А вот мой код:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

#include "InterfaceManagerInstance.h"

void IOSInterfaceManager::testMethod() {}
void IOSInterfaceManager::initialize(){
}
std::string IOSInterfaceManager::getColorPrimary(){
    return "";
}


void IOSInterfaceManager::onOver(int nameID,int fameid, int nickNameID){

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [[NSNotificationCenter defaultCenter] postNotificationName:@"openBoard" object:nil userInfo:userInfo];
            NSLog(@"Finished!");

        });

    }

userInfo:userInfo - это мой NSDictionary.

.h код файла:

class IOSInterfaceManager : public InterfaceManager
{
public:
void onOver(int nameID,int fameid, int nickNameID);
};

Теперь в моем файле swift:

override func viewDidLoad() {
        super.viewDidLoad()
 NotificationCenter.default.addObserver(self, selector: #selector(self.openBoard(notification:)), name: Notification.Name("openBoard"), object: nil)
}

    @objc func openBoard(notification: Notification) {


    }

Теперь в моем классе obj c NSLog(@"Finished!"); это печатается в моей консоли.Но openBoard не печатает.Не уверен, что проблема здесь.Любая помощь будет полезна.

Заранее спасибо!

Обновление:

Когда я добавляю точку останова в свой NSNotificationCenter, я получаю это предупреждение:

предупреждение: не удалось выполнить код поддержки для чтения данных класса Objective-C в процессе.Это может снизить качество имеющейся информации о типах.

enter image description here

1 Ответ

0 голосов
/ 01 марта 2019

Глядя на ваш пример проекта, основная проблема в том, что вы никогда не создаете экземпляр класса Swift ViewController.Таким образом, код NotificationCenter.default.addObserver никогда не запускается, и объект все равно не существует для получения уведомления.

В вашем классе testLogin.m необходимо создать свойство ViewController и создать экземпляр класса,Сделайте его свойством, а не локальной переменной, чтобы оно не выходило за рамки.

Вам также необходимо внести пару изменений в ваш класс Swift.Предположительно, вы намереваетесь загрузить это как UIViewController, так что вы могли бы оставить строку .addObserver в viewDidLoad(), но ... если вы еще ничего не сделали для фактической загрузки представленияэто тоже не назовешь.Лучше реализовать методы init и сделать это там.

В вашем примере проекта замените ViewController.swift на:

//
//  ViewController.swift
//  notificationCenter
//
//  Created by SATHISH on 3/1/19.
//  Copyright © 2019 sathish. All rights reserved.
//

import UIKit

@objc class ViewController: UIViewController {

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        print("Swift ViewController class init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) was called.")
        setupNotif()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print("Swift ViewController class init?(coder aDecoder) was called.")
        setupNotif()
    }

    init() {
        super.init(nibName: nil, bundle: nil)
        print("Swift ViewController class init() was called.")
        setupNotif()
    }

    func setupNotif() -> Void {
        NotificationCenter.default.addObserver(self, selector: #selector(self.openScoreBoard(notification:)), name: Notification.Name("openScoreBoard"), object: nil)
    }

    @objc func openScoreBoard(notification: Notification) {
        print("Swift openScoreBoard(notification: Notification) was triggered!")
    }
}

и замените testLogin.m следующим:

//
//  testLogin.m
//  notificationCenter
//
//  Created by SATHISH on 3/1/19.
//  Copyright © 2019 sathish. All rights reserved.
//

#import "testLogin.h"
#import "notificationCenter-Swift.h"

@interface testLogin ()

@property (strong, nonatomic) ViewController *swiftVC;

@end

@implementation testLogin

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // instantiate an instance of the Swift ViewController
    _swiftVC = [ViewController new];

}

- (IBAction)clickedAction:(id)sender {

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
         NSDictionary* userInfo = @{@"gameScore": @"123", @"gameID": @"123", @"gameSkillID": @"123"};
        [[NSNotificationCenter defaultCenter] postNotificationName:@"openScoreBoard" object:nil userInfo:userInfo];
        NSLog(@"Finished!");
    });
}

@end

Есть только несколько изменений - если вы сравните ваши оригиналы с ними, различия будут очевидны.

...