web-dev-qa-db-ja.com

SwiftUIでaddObserverを設定する方法は?

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)
}
3
O-mkar

これでうまくいきました

   let NC = NotificationCenter.default



   self.NC.addObserver(forName: .NEVPNStatusDidChange, object: nil, queue: nil, 
                       using: self.VPNDidChangeStatus)


   func VPNDidChangeStatus(_ notification: Notification) {


    }
1
O-mkar

これはSwiftUIネイティブのアプローチではなく、宣言型で反応型です。代わりに、CombineのNSNotificationCenter.publisher(for:object :)を使用する必要があります。

詳細は Apple Documentation を参照してください

2
Asperi

これを交換する

self.NC.addObserver(self, selector: #selector(self.VPNDidChangeStatus),
                          name: .NEVPNStatusDidChange, object: nil) 

self.NC.addObserver(self, selector: #selector(VPNDidChangeStatus(_:)),
                          name: .NEVPNStatusDidChange, object: nil)
0
Chris

NotificationCenterSwiftUIを使用する方法は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"])
        }
    }
}
0
Rohit Makwana