Как добавить наблюдателя в Swift в центр уведомлений по умолчанию? Я пытаюсь портировать эту строку кода, которая отправляет уведомление при изменении уровня заряда батареи.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
ios
swift
nsnotificationcenter
Ягода голубая
источник
источник
Ответы:
Он такой же, как Objective-C API, но использует синтаксис Swift.
Swift 4.2 и Swift 5:
Если ваш наблюдатель не наследует объект Objective-C, вы должны добавить к своему методу префикс
@objc
, чтобы использовать его в качестве селектора.Посмотрите Ссылку класса NSNotificationCenter , Взаимодействие с API Objective C
источник
UIDeviceBatteryLevelDidChangeNotification
не в кавычках? Это строковый тип.@objc
.Swift 4.0 и Xcode 9.0+:
Отправить (Post) уведомление:
ИЛИ
Получить (получить) уведомление:
Обработчик метода-функции для полученного уведомления:
Swift 3.0 и Xcode 8.0+:
Отправить (Post) уведомление:
Получить (получить) уведомление:
Обработчик метода для полученного уведомления:
Удалить уведомление:
Swift 2.3 и Xcode 7:
Отправить (Post) уведомление
Получить (Получить) Уведомление
Обработчик метода для полученного уведомления
Для исторических версий Xcode ...
Отправить (Post) уведомление
Получить (Получить) Уведомление
Удалить уведомление
Обработчик метода для полученного уведомления
Аннотируйте либо класс, либо целевой метод с помощью @objc
источник
@objc
.methodOFReceivedNotication
должен быть аннотированdynamic
или входить в подкласс NSObject.object 0x7fd68852d710 of class 'TestNotifications.MyObject' does not implement methodSignatureForSelector: -- trouble ahead
,Unrecognized selector -[TestNotifications.MyObject methodOFReceivedNotication:]
Хороший способ сделать это - использовать
addObserver(forName:object:queue:using:)
метод, а неaddObserver(_:selector:name:object:)
метод, который часто используется из кода Objective-C. Преимущество первого варианта в том, что вам не нужно использовать@objc
атрибут в вашем методе:и вы можете даже использовать замыкание вместо метода, если хотите:
Вы можете использовать возвращенное значение, чтобы прекратить прослушивание уведомления позже:
Раньше у этого метода было еще одно преимущество, заключающееся в том, что он не требовал использования строк селектора, которые не могли быть статически проверены компилятором и поэтому были хрупкими для взлома, если метод был переименован, но Swift 2.2 и позже включите
#selector
выражения, которые решают эту проблему.источник
addObserver(_:selector:name:object:)
способ отмены регистрации. Вы должны сохранить объект, возвращенныйaddObserverForName(_:object:queue:usingBlock:)
и передать егоremoveObserver:
addObserverForName(_:object:queue:usingBlock:)
.UIViewController
и ссылаетесь наself
это замыкание, вам нужно его использовать,[weak self]
иначе у вас будет цикл обращения и утечка памяти.Swift 3.0 в Xcode 8
Swift 3.0 заменил многие «строковые» API на
struct
«типы-обертки», как в случае с NotificationCenter. Уведомления теперь обозначеныstruct Notfication.Name
скорее, чем поString
. См. Руководство по переходу на Swift 3 .Предыдущее использование:
Новое использование Swift 3.0:
Все типы системных уведомлений теперь определены как статические константы
Notification.Name
; то есть.UIDeviceBatteryLevelDidChange
,.UIApplicationDidFinishLaunching
,.UITextFieldTextDidChange
и т.д.Вы можете расширить
Notification.Name
свои собственные пользовательские уведомления, чтобы соответствовать системным уведомлениям:источник
Объявить имя уведомления
Вы можете добавить наблюдателя двумя способами:
С помощью
Selector
или используя
block
Разместите ваше уведомление
Для
block
реализации на основе вам нужно сделать слабый сильный танец, если вы хотите использоватьself
внутри блока. больше информацииБлочные наблюдатели должны быть удалены подробнее
источник
Передача данных с помощью NSNotificationCenter
Вы также можете передавать данные с помощью NotificationCentre в Swift 3.0 и NSNotificationCenter в Swift 2.0.
Версия Swift 2.0
Передать информацию, используя userInfo, который является необязательным словарем типа [NSObject: AnyObject]?
Версия Swift 3.0
UserInfo теперь принимает [AnyHashable: Any]? в качестве аргумента, который мы предоставляем в качестве словаря литерала в Swift
Исходные данные проходят с использованием NotificationCentre (swift 3.0) и NSNotificationCenter (swift 2.0)
источник
В Свифт 5
ViewControllerA (приемник)
ViewControllerB (Отправитель)
источник
Я могу выполнить одно из следующих действий, чтобы успешно использовать селектор - без каких- либо комментариев с @objc:
ИЛИ
Моя версия xcrun показывает Swift 1.2, и это работает на Xcode 6.4 и Xcode 7 beta 2 (я думал, что будет использовать Swift 2.0):
источник
@objc
если ваш класс наблюдателя наследует отNSObject
.String
кSelector
. :)@objc
аннотацию из метода в своемNSObject
классе, не являющемся наблюдателем, добавилas Selector
приведение к имениString
селектора, и при запуске уведомления приложение вылетает. Моя версия Swift точно такая же, как ваша.@objc
аннотация работает для вас, а этот путь - нет, продолжайте аннотировать!В Swift 2.2 - XCode 7.3 мы используем
#selector
дляNSNotificationCenter
источник
Мы должны также удалить уведомление.
Ex.
источник
В Swift 3, Xcode 8.2: - проверка уровня заряда батареи
источник
NSNotificationCenter добавляет синтаксис наблюдателя в Swift 4.0 для iOS 11
Это для типа имени уведомления клавиатурыWillShow. Другой тип может быть выбран из доступного варианта
селектор имеет тип @objc func, который управляет тем, как будет отображаться клавиатура (это ваша пользовательская функция)
источник
#selector
должна быть аннотирована@objc
. Например:@objc func keyboardShow() { ... }
это бросило меня на минуту в Swift 4!Swift 5 & Xcode 10.2:
источник
Swift 5 Notification Observer
источник