Swift类没有使用NSNotificationCenter注册来自Objective C类的通知

时间:2016-01-13 18:51:58

标签: ios objective-c swift nsnotificationcenter

我正在重写Swift中的一个类,我在Objective C中这样做,但是,当我将新的Swift类注册为观察者时,它不响应使用NSNotificationCenter在另一个目标c类中发布的通知。

代码如下:

A类:

[[NSNotificationCenter defaultCenter] postNotificationName:REFRESH_UI object:nil];

B类(目标-c):

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshUI) name:REFRESH_UI object:nil];

- (void)refreshUI {
[self.tableView reloadData];}

B级(swift)

NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshUI", name:REFRESH_UI , object: nil)

func refreshUI() {
    self.tableView.reloadData()
}

当用Objective-c编写时,B类工作正常。我的Swift代码出了什么问题?

3 个答案:

答案 0 :(得分:3)

我刚刚进行了快速测试,从Obj-C到Swift调用通知似乎没有任何特殊注意事项。这很好用:

的AppDelegate:

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

});

Swift View:

override func viewDidLoad() {

    super.viewDidLoad()
    NSLog("loaded")
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshUI", name:"refresh" , object: nil)
}


func refreshUI() {
    NSLog("Got the callback")
}

我会验证您的REFRESH_UI是否已正确设置,并且您的观察者在发送之前已正确添加。

答案 1 :(得分:2)

您必须在Objective c中定义通知名称,如下所示:

·H:

extern NSString * DidRefreshUINotification;

的.m:

NSString *DidRefreshUINotification = @"DidRefreshUINotification"; 

[[NSNotificationCenter defaultCenter] postNotificationName: DidRefreshUINotification object:nil];

然后在Swift-class中:

NotificationCenter.default.addObserver(self, selector: #selector(someSelector(_:)), name: .DidRefreshUI, object: nil)

Objective C中的DidRefreshUINotification在Swift中只是.DidRefreshUI,因为它从名称中删除为冗余。

关于在Objective C类中发布的swift中添加通知观察器的帖子很好: http://inessential.com/2016/09/08/adding_a_notification_observer_in_swift_

答案 2 :(得分:0)

我能够找到错误。事实证明,这是另一个与此无关的类的委托问题,我需要在Swift中修复我的B类来处理委托。所以我最初发布的代码应该可以正常工作。我昨天刚转到斯威夫特,原谅我的无知。