[英]NotificationCenter in another class does not call selector in Swift
[英]How to use selector function from different class in iOS Swift, mainly for NotificationCenter
我在iOS應用中使用Tab Bar Controller,並且正在使用可達性來檢查網絡可用性並實現它,我正在使用通知。
Swift 3中通知的基本語法如下:
NotificationCenter.default.addObserver(observer: Any, selector: Selector, name: NSNotification.Name?, object: Any)
事情通常以這種方式發生-
NotificationCenter.default.addObserver(observer: self, selector: #selector(ViewControllerName.functionName), name: NameOfTheNotification, object: nil)
我想做的是-
我想使用不同類中存在的靜態函數作為選擇器,即,生成此通知時,我要調用存在於不同類中的靜態函數。
假設類名稱為“ Functions”,函數名稱為“ myFunction()”
簡而言之,我想做的是只要有通知就想從Functions類調用myFunction()函數。
我嘗試過的
我曾經嘗試過這樣做,但這無濟於事-
NotificationCenter.default.addObserver(observer: Functions(), selector: #selector(Functions.myFunction), name: NameOfTheNotification, object: nil)
您在此處嘗試的主要問題是與obj-C的互操作性。
確保使用@objc批注將函數`reachabilityStatusChanged'公開給obj-C。
@objc func reachabilityStatusChanged
另外,請確保obj-c可以看到類Functions
。 (繼承自NSObject)
最簡單的解決方法是將@objc
添加到reachabilityStatusChanged
。
// ↓
@objc func reachabilityStatusChanged(notification: Notification) {
...
}
但是NotificationCenter並不真正要求您的班級支持Objective-C。 您可以使用方法的塊變體 :
NotificationCenter.default.addObserver(forName: Notification.Name("ReachStatusChanged"), object: nil, queue: nil) { notification in
// do whatever Swift code with `notification` here.
// no need to add @objc anywhere.
reachabilityStatusChanged(notification)
}
為什么必須保留Functions()
class Foo {
@objc func test() {
print("Hello")
}
}
var foo: Foo? = Foo()
let nc = NotificationCenter.default
nc.addObserver(foo!,
selector: #selector(Foo.test),
name: NSNotification.Name(rawValue: "Barrr"),
object: nil)
nc.post(name: NSNotification.Name(rawValue: "Barrr"), object: nil)
nc.post(name: NSNotification.Name(rawValue: "Barrr"), object: nil)
foo = nil
nc.post(name: NSNotification.Name(rawValue: "Barrr"), object: nil)
這將打印Hello
兩次,而不是打印三次,因為foo類在第三個調用之前被釋放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.