NotificationCenter 没有在我的 obj c class(utills class 或 object class)中触发。不是 viewcontroller

NotificationCenter is not getting trigger in my obj c class ( utills class or object class ). Not an viewcontroller

我有一个 obj c class, 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 class NSLog(@"Finished!"); 中正在我的控制台中打印。但是 openBoard 没有打印。不确定这里的问题是什么。任何帮助都会有用。

提前致谢!

更新:

当我在 NSNotificationCenter 中添加断点时,我收到此警告:

warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available.

查看您的示例项目,主要问题是您从不实例化 Swift ViewController class。因此,NotificationCenter.default.addObserver 代码永远不会运行,并且该对象也不存在以获取通知。

在您的 testLogin.m class 中,您需要创建一个 ViewController 属性,并实例化 class。使它成为 属性 而不是局部变量,这样它就不会超出范围。

您还需要对 Swift class 进行一些更改。据推测,您打算将其加载为 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

只有一些变化 -- 如果您将您的原件与这些进行比较,差异就会很明显。