Глядя на ваш пример проекта, основная проблема в том, что вы никогда не создаете экземпляр класса 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
Есть только несколько изменений - если вы сравните ваши оригиналы с ними, различия будут очевидны.