Wie füge ich einen Beobachter in Swift zum Standard-Benachrichtigungscenter hinzu? Ich versuche, diese Codezeile zu portieren, die eine Benachrichtigung sendet, wenn sich der Akkuladestand ändert.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
ios
swift
nsnotificationcenter
Beerenblau
quelle
quelle
Antworten:
Es ist dasselbe wie die Objective-C-API, verwendet jedoch die Swift-Syntax.
Swift 4.2 & Swift 5:
Wenn Ihr Beobachter nicht von einem Objective-C-Objekt erbt, müssen Sie Ihrer Methode ein Präfix voranstellen
@objc
, um sie als Selektor verwenden zu können.Siehe NSNotificationCenter-Klassenreferenz , Interaktion mit Objective-C-APIs
quelle
UIDeviceBatteryLevelDidChangeNotification
nicht in Anführungszeichen? Es ist ein String-Typ.@objc
.Swift 4.0 & Xcode 9.0+:
Benachrichtigung senden (posten):
ODER
Benachrichtigung erhalten (erhalten):
Funktionsmethoden-Handler für empfangene Benachrichtigung:
Swift 3.0 & Xcode 8.0+:
Benachrichtigung senden (posten):
Benachrichtigung erhalten (erhalten):
Methodenhandler für empfangene Benachrichtigung:
Benachrichtigung entfernen:
Swift 2.3 & Xcode 7:
Benachrichtigung senden (posten)
Benachrichtigung erhalten (erhalten)
Methodenhandler für empfangene Benachrichtigung
Für historische Xcode-Versionen ...
Benachrichtigung senden (posten)
Benachrichtigung erhalten (erhalten)
Benachrichtigung entfernen
Methodenhandler für empfangene Benachrichtigung
Kommentieren Sie entweder die Klasse oder die Zielmethode mit @objc
quelle
@objc
.methodOFReceivedNotication
muss entweder mitdynamic
einer Unterklasse von NSObject versehen sein oder Mitglied einer Unterklasse von NSObject sein.object 0x7fd68852d710 of class 'TestNotifications.MyObject' does not implement methodSignatureForSelector: -- trouble ahead
,Unrecognized selector -[TestNotifications.MyObject methodOFReceivedNotication:]
Eine gute Möglichkeit, dies zu tun, besteht darin, die
addObserver(forName:object:queue:using:)
Methode anstelle deraddObserver(_:selector:name:object:)
Methode zu verwenden, die häufig aus Objective-C-Code verwendet wird. Der Vorteil der ersten Variante besteht darin, dass Sie das@objc
Attribut für Ihre Methode nicht verwenden müssen :und Sie können sogar einfach einen Verschluss anstelle einer Methode verwenden, wenn Sie möchten:
Sie können den zurückgegebenen Wert verwenden, um die Benachrichtigung später nicht mehr abzuhören:
Früher hatte die Verwendung dieser Methode einen weiteren Vorteil: Sie mussten keine Selektorzeichenfolgen verwenden, die vom Compiler nicht statisch überprüft werden konnten, und waren daher anfällig für Unterbrechungen, wenn die Methode umbenannt wurde, aber Swift 2.2 und Fügen Sie später
#selector
Ausdrücke hinzu , die dieses Problem beheben.quelle
addObserver(_:selector:name:object:)
Art der Abmeldung. Sie müssen das zurückgegebene Objekt behaltenaddObserverForName(_:object:queue:usingBlock:)
und anremoveObserver:
addObserverForName(_:object:queue:usingBlock:)
.UIViewController
undself
in diesem Abschluss darauf verweisen , müssen Sie es verwenden,[weak self]
oder Sie haben einen Referenzzyklus und den Speicherverlust.Swift 3.0 in Xcode 8
Swift 3.0 hat viele "streng typisierte" APIs durch
struct
"Wrapper-Typen" ersetzt, wie dies bei NotificationCenter der Fall ist. Benachrichtigungen werden jetztstruct Notfication.Name
eher durch a als durch gekennzeichnetString
. Weitere Informationen finden Sie im Handbuch Migrieren zu Swift 3 .Vorherige Verwendung:
Neue Verwendung von Swift 3.0:
Alle Systembenachrichtigungstypen sind jetzt als statische Konstanten für definiert
Notification.Name
. dh.UIDeviceBatteryLevelDidChange
,.UIApplicationDidFinishLaunching
,.UITextFieldTextDidChange
etc.Sie können
Notification.Name
mit Ihren eigenen benutzerdefinierten Benachrichtigungen erweitern, um mit den Systembenachrichtigungen konsistent zu bleiben:quelle
Deklarieren Sie einen Benachrichtigungsnamen
Sie können Beobachter auf zwei Arten hinzufügen:
Verwenden von
Selector
oder mit
block
Veröffentlichen Sie Ihre Benachrichtigung
Für eine
block
basierte Implementierung müssen Sie einen schwach-starken Tanz ausführen, wenn Sieself
innerhalb des Blocks verwenden möchten . Mehr InfoBlockbasierte Beobachter müssen entfernt werden, um weitere Informationen zu erhalten
quelle
Übergeben Sie Daten mit NSNotificationCenter
Sie können Daten auch mit NotificationCentre in Swift 3.0 und NSNotificationCenter in Swift 2.0 übergeben.
Swift 2.0 Version
Informationen mit userInfo übergeben, einem optionalen Wörterbuch vom Typ [NSObject: AnyObject]?
Swift 3.0 Version
Die userInfo nimmt jetzt [AnyHashable: Any]? als Argument, das wir in Swift als Wörterbuchliteral bereitstellen
Quelle Passdaten mit NotificationCentre (swift 3.0) und NSNotificationCenter (swift 2.0)
quelle
In Swift 5
ViewControllerA (Empfänger)
ViewControllerB (Absender)
quelle
Ich kann einen der folgenden Schritte ausführen, um einen Selektor erfolgreich zu verwenden - ohne mit @objc etwas zu kommentieren:
ODER
Meine xcrun-Version zeigt Swift 1.2 und dies funktioniert unter Xcode 6.4 und Xcode 7 Beta 2 (von denen ich dachte, dass sie Swift 2.0 verwenden würden):
quelle
@objc
wenn Ihre Beobachterklasse von erbtNSObject
.String
zu werfen müssenSelector
. :)@objc
Anmerkung aus der Methode in meiner Nicht-NSObject
Beobachter-Klasse entfernt, dasas Selector
Casting zumString
Selektornamen hinzugefügt , und wenn die Benachrichtigung ausgelöst wird, stürzt die App ab. Meine Swift-Version ist genau die gleiche wie deine.@objc
Annotation für Sie funktioniert und auf diese Weise nicht, kommentieren Sie weiter!In Swift 2.2 - XCode 7.3 verwenden wir
#selector
fürNSNotificationCenter
quelle
Wir sollten auch die Benachrichtigung entfernen.
Ex.
quelle
In Swift 3, Xcode 8.2: - Überprüfen des Batteriestatus
quelle
NSNotificationCenter fügt Beobachter-Syntax in Swift 4.0 für iOS 11 hinzu
Dies gilt für den Benachrichtigungstyp "keyboardWillShow". Ein anderer Typ kann aus der verfügbaren Option ausgewählt werden
Der Selektor ist vom Typ @objc func und regelt, wie die Tastatur angezeigt wird (dies ist Ihre Benutzerfunktion).
quelle
#selector
Anmerkungen versehen werden muss@objc
. Zum Beispiel:@objc func keyboardShow() { ... }
Das hat mich in Swift 4 für eine Minute geworfen!Swift 5 & Xcode 10.2:
quelle
Swift 5 Notification Observer
quelle