SwiftUIにNotificationCenter.default.addObserveを追加するにはどうすればよいですか?
オブザーバーを追加しようとすると、以下のエラーが発生します
「#selector」の引数は、Objective-Cに公開されていないインスタンスメソッド「VPNDidChangeStatus」を参照しています
しかし、funcの前に@ objcを追加すると、エラーが発生します
@objcは、クラスのメンバー、@ objcプロトコル、およびクラスの具象拡張でのみ使用できます
これが私のコードです
let NC = NotificationCenter.default
var body: some View {
VStack() {
}.onAppear {
self.NC.addObserver(self, selector: #selector(self.VPNDidChangeStatus),
name: .NEVPNStatusDidChange, object: nil)
}
}
@objc func VPNDidChangeStatus(_ notification: Notification) {
// print("VPNDidChangeStatus", VPNManager.shared.status)
}
これでうまくいきました
let NC = NotificationCenter.default
self.NC.addObserver(forName: .NEVPNStatusDidChange, object: nil, queue: nil,
using: self.VPNDidChangeStatus)
func VPNDidChangeStatus(_ notification: Notification) {
}
これはSwiftUIネイティブのアプローチではなく、宣言型で反応型です。代わりに、CombineのNSNotificationCenter.publisher(for:object :)を使用する必要があります。
詳細は Apple Documentation を参照してください
これを交換する
self.NC.addObserver(self, selector: #selector(self.VPNDidChangeStatus),
name: .NEVPNStatusDidChange, object: nil)
に
self.NC.addObserver(self, selector: #selector(VPNDidChangeStatus(_:)),
name: .NEVPNStatusDidChange, object: nil)
NotificationCenter
でSwiftUI
を使用する方法は1つあります。
詳細情報 Appleドキュメント
通知範囲n
extension NSNotification {
static let ImageClick = NSNotification.Name.init("ImageClick")
}
ContentView
struct ContentView: View {
var body: some View {
VStack {
DetailView()
}
.onReceive(NotificationCenter.default.publisher(for: NSNotification.ImageClick))
{ obj in
// Change key as per your "userInfo"
if let userInfo = obj.userInfo, let info = userInfo["info"] {
print(info)
}
}
}
}
DetailView
struct DetailView: View {
var body: some View {
Image(systemName: "wifi")
.frame(width: 30,height: 30, alignment: .center)
.foregroundColor(AppColor.black)
.onTapGesture {
NotificationCenter.default.post(name: NSNotification.ImageClick,
object: nil, userInfo: ["info": "Test"])
}
}
}