我正在重写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代码出了什么问题?
答案 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类来处理委托。所以我最初发布的代码应该可以正常工作。我昨天刚转到斯威夫特,原谅我的无知。