簡體   English   中英

如何在iOS Swift中使用不同類的選擇器功能,主要用於NotificationCenter

[英]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)

發生錯誤,並且該錯誤如下所示-我已在下面附加了Xcode快照。 錯誤的快照

您在此處嘗試的主要問題是與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM