web-dev-qa-db-fra.com

Comment définir addObserver dans SwiftUI?

Comment ajouter NotificationCenter.default.addObserve dans SwiftUI?

Quand j'ai essayé d'ajouter un observateur, j'obtiens en dessous de l'erreur

L'argument de '#selector' fait référence à la méthode d'instance 'VPNDidChangeStatus' qui n'est pas exposée à Objective-C

Mais quand j'ajoute @ objc devant func j'obtiens en dessous de l'erreur

@objc ne peut être utilisé qu'avec des membres de classes, des protocoles @objc et des extensions concrètes de classes

Voici mon code

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

Cela a fonctionné pour moi

   let NC = NotificationCenter.default



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


   func VPNDidChangeStatus(_ notification: Notification) {


    }
1
O-mkar

Ce n'est pas une approche native de SwiftUI, qui est déclarative et réactive. Au lieu de cela, vous devez utiliser NSNotificationCenter.publisher (pour: objet :) de Combine.

Voir plus de détails dans Documentation Apple

2
Asperi

échange ceci

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

J'ai une approche pour l'utilisation de NotificationCenter dans SwiftUI.

Pour plus d'informations Documentation Apple

Extension de notification 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