Bagaimana Anda menambahkan pengamat di Swift ke pusat pemberitahuan default? Saya mencoba untuk mem-porting baris kode ini yang mengirimkan pemberitahuan ketika level baterai berubah.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
ios
swift
nsnotificationcenter
Berry Blue
sumber
sumber
Jawaban:
Itu sama dengan Objective-C API, tetapi menggunakan sintaks Swift.
Swift 4.2 & Swift 5:
Jika pengamat Anda tidak mewarisi dari objek Objective-C, Anda harus mengawali metode Anda
@objc
untuk menggunakannya sebagai pemilih.Lihat Referensi Kelas NSNotificationCenter , Berinteraksi dengan API Objective-C
sumber
UIDeviceBatteryLevelDidChangeNotification
tidak ada dalam tanda kutip? Ini adalah tipe string.@objc
.Swift 4.0 & Xcode 9.0+:
Kirim (Posting) Pemberitahuan:
ATAU
Terima (Dapatkan) Pemberitahuan:
Penangan Fungsi-Metode untuk Pemberitahuan yang diterima:
Swift 3.0 & Xcode 8.0+:
Kirim (Posting) Pemberitahuan:
Terima (Dapatkan) Pemberitahuan:
Penangan metode untuk Notifikasi yang diterima:
Hapus Pemberitahuan:
Swift 2.3 & Xcode 7:
Kirim (Posting) Pemberitahuan
Terima (Dapatkan) Pemberitahuan
Penangan metode untuk Notifikasi yang diterima
Untuk versi Xcode yang bersejarah ...
Kirim (Posting) Pemberitahuan
Terima (Dapatkan) Pemberitahuan
Hapus Notifikasi
Penangan metode untuk Notifikasi yang diterima
Membubuhi keterangan kelas atau metode target dengan @objc
sumber
@objc
.methodOFReceivedNotication
harus dianotasi dengandynamic
atau menjadi anggota subkelas NSObject.object 0x7fd68852d710 of class 'TestNotifications.MyObject' does not implement methodSignatureForSelector: -- trouble ahead
,Unrecognized selector -[TestNotifications.MyObject methodOFReceivedNotication:]
Cara yang baik untuk melakukan ini adalah dengan menggunakan
addObserver(forName:object:queue:using:)
metode daripadaaddObserver(_:selector:name:object:)
metode yang sering digunakan dari kode Objective-C. Keuntungan dari varian pertama adalah Anda tidak harus menggunakan@objc
atribut pada metode Anda:dan Anda bahkan bisa menggunakan penutupan alih-alih metode jika Anda mau:
Anda dapat menggunakan nilai yang dikembalikan untuk berhenti mendengarkan notifikasi nanti:
Dulu ada keuntungan lain dalam menggunakan metode ini, yaitu bahwa hal itu tidak mengharuskan Anda untuk menggunakan string pemilih yang tidak dapat diperiksa secara statis oleh kompiler dan sangat rapuh untuk dipecahkan jika metode ini diganti namanya, tetapi Swift 2.2 dan nanti termasuk
#selector
ekspresi yang memperbaiki masalah itu.sumber
addObserver(_:selector:name:object:)
cara tidak mendaftar. Anda harus menyimpan objek kembaliaddObserverForName(_:object:queue:usingBlock:)
dan meneruskannya keremoveObserver:
addObserverForName(_:object:queue:usingBlock:)
.UIViewController
dan merujukself
pada penutupan itu, Anda perlu menggunakan[weak self]
atau Anda akan memiliki siklus referensi dan kebocoran memori.Swift 3.0 di Xcode 8
Swift 3.0 telah menggantikan banyak API "typly-typed" dengan
struct
"wrapper types", seperti halnya NotificationCenter. Pemberitahuan sekarang diidentifikasi olehstruct Notfication.Name
bukan olehString
. Lihat panduan Migrasi ke Swift 3 .Penggunaan sebelumnya :
Penggunaan Swift 3.0 baru:
Semua jenis notifikasi sistem sekarang didefinisikan sebagai konstanta statis pada
Notification.Name
; yaitu.UIDeviceBatteryLevelDidChange
,.UIApplicationDidFinishLaunching
,.UITextFieldTextDidChange
, dllAnda dapat memperluas
Notification.Name
dengan notifikasi khusus Anda sendiri agar tetap konsisten dengan notifikasi sistem:sumber
Nyatakan nama notifikasi
Anda dapat menambahkan pengamat dengan dua cara:
Menggunakan
Selector
atau menggunakan
block
Posting pemberitahuan Anda
Untuk
block
implementasi berbasis Anda perlu melakukan tarian lemah-kuat jika Anda ingin menggunakanself
di dalam blok. Info lebih lanjutPengamat berbasis blok perlu dihapus info lebih lanjut
sumber
Lulus Data menggunakan NSNotificationCenter
Anda juga dapat meneruskan data menggunakan NotificationCentre di swift 3.0 dan NSNotificationCenter di swift 2.0.
Versi Swift 2.0
Lulus info menggunakan userInfo yang merupakan Kamus jenis opsional [NSObject: AnyObject]?
Versi Swift 3.0
UserInfo sekarang menggunakan [AnyHashable: Any]? sebagai argumen, yang kami sediakan sebagai kamus literal di Swift
Source pass data menggunakan NotificationCentre (swift 3.0) dan NSNotificationCenter (swift 2.0)
sumber
Dalam Swift 5
ViewControllerA (Penerima)
ViewControllerB (Pengirim)
sumber
Saya dapat melakukan salah satu dari yang berikut ini untuk berhasil menggunakan pemilih - tanpa membubuhi keterangan apa pun dengan @objc:
ATAU
Versi xcrun saya menunjukkan Swift 1.2, dan ini berfungsi pada Xcode 6.4 dan Xcode 7 beta 2 (yang saya pikir akan menggunakan Swift 2.0):
sumber
@objc
jika kelas pengamat Anda mewarisi dariNSObject
.String
keSelector
salah satu. :)@objc
anotasi dari metode diNSObject
kelas non- pengamat saya , menambahkanas Selector
casting keString
nama pemilih, dan ketika pemberitahuan menyala aplikasi crash. Versi Swift saya persis sama dengan versi Swift Anda.@objc
anotasi berfungsi untuk Anda, dan dengan cara ini tidak, maka terus anotasi!Di swift 2.2 - XCode 7.3, kami gunakan
#selector
untukNSNotificationCenter
sumber
Kami juga harus menghapus notifikasi.
Ex.
sumber
Dalam cepat 3, Xcode 8.2: - memeriksa tingkat status baterai
sumber
NSNotificationCenter menambahkan sintaksis pengamat di Swift 4.0 untuk iOS 11
Ini untuk jenis nama notifikasi keyboardWillShow. Jenis lain dapat dipilih dari opsi yang tersedia
Selector bertipe @objc func yang menangani bagaimana keyboard akan ditampilkan (ini adalah fungsi pengguna Anda)
sumber
#selector
harus dijelaskan@objc
. Sebagai contoh:@objc func keyboardShow() { ... }
Itu membuat saya berpikir sebentar di Swift 4!Swift 5 & Xcode 10.2:
sumber
Pengamat Pemberitahuan Swift 5
sumber