462 Stimmen

NSNotificationCenter addObserver in Swift

Wie fügt man in Swift einen Beobachter zum Standard-Benachrichtigungscenter hinzu? Ich versuche diese Codezeile zu übertragen, die eine Benachrichtigung sendet, wenn sich der Batteriestand ändert.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];

3voto

leanne Punkte 6886

Ich kann eine der folgenden Optionen verwenden, um einen Selektor erfolgreich zu verwenden - ohne etwas mit @objc zu kennzeichnen:

NSNotificationCenter.defaultCenter().addObserver(self,
    selector:"batteryLevelChanged:" as Selector,
    name:"UIDeviceBatteryLevelDidChangeNotification",
    object:nil)    

ODER

let notificationSelector: Selector = "batteryLevelChanged:"

NSNotificationCenter.defaultCenter().addObserver(self,
    selector: notificationSelector,
    name:"UIDeviceBatteryLevelDidChangeNotification",
    object:nil)    

Meine xcrun-Version zeigt Swift 1.2 an und dies funktioniert auf Xcode 6.4 und Xcode 7 Beta 2 (von denen ich dachte, dass sie Swift 2.0 verwenden würden):

$xcrun swift --version

Apple Swift version 1.2 (swiftlang-602.0.53.1 clang-602.0.53)

2voto

Deepak Thakur Punkte 3345

In Swift 2.2 - XCode 7.3 verwenden wir #selector für NSNotificationCenter

 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(rotate), name: UIDeviceOrientationDidChangeNotification, object: nil)

2voto

Pankaj Jangid Punkte 724

Wir sollten auch die Benachrichtigung entfernen.

Beispiel:

deinit 
{
  NotificationCenter.default.removeObserver(self, name:NSNotification.Name(rawValue: "notify"), object: nil)

}

1voto

Brianna Doubt Punkte 569

Mein bevorzugter Weg, dasselbe zu erreichen, ist mit .sink von Combine. Dadurch müssen Sie Ihren Handler nicht mit @objc markieren.

Erstellen Sie zunächst eine Benachrichtigung, wie Sie möchten. Ich verwende gerne ein paar Erweiterungen

extension Notification.Name {
    static var tap: Notification.Name {
        .init("tap")
    }
}

extension Notification {
    static func tap(_ point: CGPoint) -> Notification {
        Notification(name: .tap, object: point)
    }
}

UIKit / Benutzerdefiniertes Objekt

Erstellen Sie dann eine Registrierungsfunktion in einem Objekt, die NotificationCenter.default.publisher(for:) aufruft:

import Combine

class TapNotifier {
    var cancellables: Set = []

    func register() {
        NotificationCenter.default
            .publisher(for: .tap)
            .sink { [weak self] tapNotification in
                // Dieser Block wird jedes Mal aufgerufen, wenn eine `.tap`-Benachrichtigung empfangen wird.

                // Entpacken des gesendeten Objekts
                guard let point = tapNotification.object as? CGPoint else {
                    return
                }

                // Rufen Sie Ihre Handlerfunktion auf
                self?.tapped(at: point)
            }
            .store(in: &cancellables)
    }

    func tapped(at point: CGPoint) {
        print("An \(point) getippt")
    }
}

SwiftUI iOS 15

Der Publisher von NotificationCenter.default kann auch in einer SwiftUI-Ansicht wie folgt beobachtet werden:

extension Notification {
    static var tap: Notification {
        Notification(name: .tap)
    }
}

struct TapsView: View {
    @State var taps: Int = 0

    var message: String {
        "Button \(taps) Mal gedrückt " + (taps == 1 ? "Zeit" : "Zeiten")
    }

    var body: some View {
        Text(message)
            .onReceive(NotificationCenter.default.publisher(for: .tap)) { tapNotification in
                // Dieser Block wird jedes Mal aufgerufen, wenn eine `.tap`-Benachrichtigung empfangen wird.
                taps += 1
            }
            .onTapGesture {
                NotificationCenter.default.post(.tap))
            }
    }
}

SwiftUI iOS 16+

struct TapsView: View {
    @State var taps: Int = 0

    var message: String {
        "Button \(taps) Mal gedrückt " + (taps == 1 ? "Zeit" : "Zeiten")
    }

    var body: some View {
        Text(message)
            .onReceive(NotificationCenter.default.publisher(for: .tap)) { tapNotification in
                // Dieser Block wird jedes Mal aufgerufen, wenn eine `.tap`-Benachrichtigung empfangen wird.

                // Entpacken des gesendeten Objekts
                guard let point = tapNotification.object as? CGPoint else {
                    return
                }

                taps += 1
            }
            .onTapGesture { point in
                NotificationCenter.default.post(.tap(point))
            }
    }
}

1voto

Ashim Dahal Punkte 1049

NSNotificationCenter Hinzufügen des Beobachtersyntax in Swift 4.0 für iOS 11

  NotificationCenter.default.addObserver(self, selector: #selector(keyboardShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

Dies gilt für den Benachrichtigungsnamens Typ keyboardWillShow. Ein anderer Typ kann aus den verfügbaren Optionen ausgewählt werden

Der Selektor ist vom Typ @objc func, der definiert, wie die Tastatur angezeigt wird (das ist Ihre Benutzerfunktion)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X