2016-01-13 16 views
4

我在Objective C中重寫Swift中的一個類,但是當我將新的Swift類註冊爲觀察者時,它不響應發佈在另一個使用NSNotificationCenter的目標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類(S​​WIFT)

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

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

B類在使用objective-c編寫時工作正常。我的Swift代碼有什麼問題?

+0

是否沒有宏定義通知名工作?我不知道這是不是在評估Swift中的正確類型。 – pbergson

+0

我試過,並且已經不使用宏。在它是@「RefreshUI」之前,所以我在Swift方法的名稱中使用了「RefreshUI」。 – Jonathan

+0

我剛發現一個與此無關的問題。所以我的代碼實際上可能是正確的。 – Jonathan

回答

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!"); 

}); 

斯威夫特查看:

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正確設置上都和你之前派遣觀察員的正確添加。

+0

是的,我相信問題來自其他地方,當我使用B的Swift類時,A類不再發布通知。 – Jonathan

0

我能夠找到錯誤。事實證明,這是另一個與此無關的類的委託問題,我需要在Swift中修復我的類B來處理委託。所以我最初發布的代碼應該可以正常工作。我昨天剛剛切換到Swift,所以請原諒我的無知。

+0

當我切換到Swift時,我認爲我遇到的每個問題都是Swift或互操作性問題。我花了大約3個小時想念我沒有連接故事板上的插座。 – pbergson

2

你的目標C這樣來定義通知名稱:

.H:

extern NSString * DidRefreshUINotification; 

.M:

NSString *DidRefreshUINotification = @"DidRefreshUINotification"; 

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

,然後在雨燕類:

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

DidRefreshUINotification in Objective C在Swift中變成了.DidRefreshUI,因爲它被從名稱中刪除爲冗餘。

有關於迅速張貼在目標C類中添加通知觀察者好的帖子: http://inessential.com/2016/09/08/adding_a_notification_observer_in_swift_

相關問題