Jak dodać obserwatora w Swift do domyślnego centrum powiadomień? Próbuję przenieść ten wiersz kodu, który wysyła powiadomienie o zmianie poziomu baterii.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
ios
swift
nsnotificationcenter
Niebieska Jagoda
źródło
źródło
Odpowiedzi:
Jest taki sam jak interfejs API Objective-C, ale używa składni Swift.
Swift 4.2 i Swift 5:
Jeśli Twój obserwator nie dziedziczy po obiekcie Objective-C, musisz
@objc
użyć prefiksu metody , aby użyć go jako selektora.Zobacz NSNotificationCenter Class Reference , Interakcja z interfejsami API Objective-C
źródło
UIDeviceBatteryLevelDidChangeNotification
nie ma w cytatach? To typ struny.@objc
.Swift 4.0 i Xcode 9.0+:
Wyślij (Post) Powiadomienie:
LUB
Otrzymuj (otrzymuj) powiadomienie:
Moduł obsługi funkcji dla otrzymanego powiadomienia:
Swift 3.0 i Xcode 8.0+:
Wyślij (Post) Powiadomienie:
Otrzymuj (otrzymuj) powiadomienie:
Procedura obsługi otrzymanego powiadomienia:
Usuń powiadomienie:
Swift 2.3 i Xcode 7:
Wyślij (post) powiadomienie
Otrzymuj (otrzymuj) powiadomienie
Procedura obsługi otrzymanego powiadomienia
Dla historycznych wersji Xcode ...
Wyślij (post) powiadomienie
Otrzymuj (otrzymuj) powiadomienie
Usuń powiadomienie
Procedura obsługi otrzymanego powiadomienia
Adnotuj klasę lub metodę docelową za pomocą @objc
źródło
@objc
.methodOFReceivedNotication
musi być opatrzony adnotacjamidynamic
lub należeć do podklasy NSObject.object 0x7fd68852d710 of class 'TestNotifications.MyObject' does not implement methodSignatureForSelector: -- trouble ahead
,Unrecognized selector -[TestNotifications.MyObject methodOFReceivedNotication:]
Dobrym sposobem na to jest użycie
addObserver(forName:object:queue:using:)
metody, a nieaddObserver(_:selector:name:object:)
metody często używanej z kodu Objective-C. Zaletą pierwszego wariantu jest to, że nie musisz używać@objc
atrybutu w metodzie:i możesz nawet użyć zamknięcia zamiast metody, jeśli chcesz:
Możesz użyć zwróconej wartości, aby zatrzymać nasłuchiwanie powiadomienia później:
Inną zaletą tej metody było to, że nie wymagała użycia ciągów selektora, których kompilator nie mógł sprawdzić statycznie, a więc były podatne na zerwanie, jeśli zmieniono nazwę metody, ale Swift 2.2 i później zawierają
#selector
wyrażenia, które rozwiązują ten problem.źródło
addObserver(_:selector:name:object:)
sposób wyrejestrowania. Musisz zatrzymać obiektaddObserverForName(_:object:queue:usingBlock:)
i przekazać goremoveObserver:
addObserverForName(_:object:queue:usingBlock:)
.UIViewController
i odniesiesz się doself
tego zamknięcia, musisz użyć[weak self]
lub będziesz miał cykl odniesienia i wyciek pamięci.Swift 3.0 w Xcode 8
Swift 3.0 zastąpił wiele interfejsów API o „ciągłym typie”
struct
„typami opakowań”, jak ma to miejsce w przypadku NotificationCenter. Powiadomienia są teraz identyfikowane przezstruct Notfication.Name
raczej niż przezString
. Zobacz przewodnik Migracja do Swift 3 .Poprzednie użycie:
Nowe zastosowanie Swift 3.0:
Wszystkie typy powiadomień systemowych są teraz zdefiniowane jako stałe statyczne
Notification.Name
; czyli.UIDeviceBatteryLevelDidChange
,.UIApplicationDidFinishLaunching
,.UITextFieldTextDidChange
, itd.Możesz rozszerzyć
Notification.Name
swoje własne niestandardowe powiadomienia, aby zachować spójność z powiadomieniami systemowymi:źródło
Zadeklaruj nazwę powiadomienia
Możesz dodać obserwatora na dwa sposoby:
Za pomocą
Selector
lub za pomocą
block
Opublikuj swoje powiadomienie
W przypadku
block
implementacji bazowej musisz wykonać słabo silny taniec, jeśli chcesz użyćself
w bloku. więcej informacjiObserwatorzy z blokami muszą zostać usunięci więcej informacji
źródło
Przekaż dane za pomocą NSNotificationCenter
Możesz również przekazywać dane za pomocą NotificationCentre w swift 3.0 i NSNotificationCenter w swift 2.0.
Wersja Swift 2.0
Przekazywać informacje za pomocą userInfo, który jest opcjonalnym słownikiem typu [NSObject: AnyObject]?
Wersja Swift 3.0
UserInfo ma teraz [AnyHashable: Any]? jako argument, który podajemy jako dosłowny słownik w Swift
Przekazywanie danych źródłowych za pomocą NotificationCentre (swift 3.0) i NSNotificationCenter (swift 2.0)
źródło
W Swift 5
ViewControllerA (odbiornik)
ViewControllerB (Sender)
źródło
Jestem w stanie wykonać jedną z następujących czynności, aby z powodzeniem korzystać z selektora - bez adnotacji w @objc:
LUB
Moja wersja xcrun pokazuje Swift 1.2, a to działa na Xcode 6.4 i Xcode 7 beta 2 (które, jak myślałem, będą używać Swift 2.0):
źródło
@objc
jeśli twoja klasa obserwatora dziedziczyNSObject
.String
zSelector
nich. :)@objc
adnotację z metody w mojejNSObject
klasie innej niż obserwator, dodałemas Selector
rzutowanie doString
nazwy selektora, a gdy powiadomienie się uruchomi, aplikacja ulega awarii. Moja wersja Swift jest dokładnie taka sama jak Twoja.@objc
adnotacja działa dla Ciebie, a tak nie działa, to kontynuuj adnotacje!W swift 2.2 - XCode 7.3 używamy
#selector
doNSNotificationCenter
źródło
Powinniśmy również usunąć powiadomienie.
Dawny.
źródło
W swift 3, Xcode 8.2: - sprawdzanie poziomu naładowania baterii
źródło
NSNotificationCenter dodaje składnię obserwatora w Swift 4.0 dla iOS 11
Dotyczy to typu nazwy powiadomienia keyboardWillShow. Z dostępnej opcji można wybrać inny typ
selektor jest typu @objc func, który obsługuje sposób wyświetlania klawiatury (jest to funkcja użytkownika)
źródło
#selector
musi być opatrzona adnotacjami@objc
. Na przykład:@objc func keyboardShow() { ... }
To rzuciło mnie na minutę w Swift 4!Swift 5 i Xcode 10.2:
źródło
Swift 5 Notification Observer
źródło