В сегодняшнем кратком совете вы узнаете о классе NSNotification при создании демонстрационного проекта для отслеживания изменений в ориентации устройства. Давайте начнем!
Заказ из продовольственной корзины очень похож на работу с NSNotification
. Вы подходите к прилавку, оформляете заказ, получаете номер и ждете, когда вам позвонят. Вы обычно стоите рядом с пятью другими людьми, которые ждут, чтобы их номер был также назван. И когда шеф-повар заканчивает готовить еду, человек за стойкой набирает ваш номер, и вы садитесь есть. С NSNotification
вы становитесь наблюдателем «своего номера», а когда объект, NSNotificationCenter
уведомление, NSNotificationCenter
« NSNotificationCenter
еду», NSNotificationCenter
вызывает ваш номер, чтобы вы могли прийти и получить «еду». В этом уроке вместо ожидания еды мы будем ждать поворота устройства, а затем отправлять текущую ориентацию наблюдателю. Мы поговорим о том, как зарегистрироваться, чтобы получать уведомления, публиковать уведомления и передавать строковый объект вместе с уведомлением, используя userInfo
.
Шаг 1: Настройте свой проект
Запустите Xcode и нажмите «Файл»> «Создать»> «Проект». Выберите приложение iOS Single View и нажмите «Далее». Назовите свой продукт «Уведомления» и введите имя для своего идентификатора компании, например, «com.companyName.notifications». Выберите семейство устройств iPhone и нажмите «Далее». Выберите место для хранения вашего проекта и нажмите «Создать».
Шаг 2: Зарегистрируйтесь, чтобы получить уведомление
Объявите методы, используемые для публикации и получения уведомления, введя следующий код в файле «ViewController.m».
1
2
3
4
|
@interface ViewController ()
— (void)postNotificationWithString:(NSString *)orientation;
— (void)useNotificationWithString:(NSNotification*)notification;
@end
|
Получение уведомления
Теперь мы можем зарегистрировать объект ViewController
для получения уведомлений. Введите следующий код в метод viewDidLoad
.
1
2
3
4
5
6
7
|
NSString *notificationName = @»MTPostNotificationTut»;
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(useNotificationWithString:)
name:notificationName
object:nil];
|
Существует четыре важных части метода addObserver:selector:name:object:
Аргумент для addObserver:
это объект, который хочет знать, когда происходит определенное уведомление. Аргумент для selector:
это метод, который вызывается при получении уведомления. Аргумент для name:
это название уведомления, о котором хочет знать наблюдатель; оно должно быть уникальным. Последним элементом метода является object:
Его аргументом является объект, прикрепленный к уведомлению, и он часто равен nil
зависимости от контекста уведомления.
Шаг 3: опубликовать уведомление
Далее мы сгенерируем логику для отправки уведомления. Введите следующий код в файле «ViewController.m». Пользовательский метод postNotificationWithString:
ранее объявленный принимает один аргумент, представляющий ориентацию устройства.
1
2
3
4
5
6
7
|
— (void)postNotificationWithString:(NSString *)orientation //post notification method and logic
{
NSString *notificationName = @»MTPostNotificationTut»;
NSString *key = @»OrientationStringValue»;
NSDictionary *dictionary = [NSDictionary dictionaryWithObject:orientation forKey:key];
[[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:nil userInfo:dictionary];
}
|
Существует три важных части метода postNotificationName:object:userInfo:
Аргумент для postNotificationName:
является заголовком уведомления, которое было зарегистрировано в предыдущем addObserver:selector:name:object:
method. Аргумент для object:
снова является объектом, отправляющим уведомление, и в этом случае равен nil
. Аргументом для userInfo
является NSDictionary
который можно использовать для отправки дополнительной информации с уведомлением. userInfo
может быть nil
, но в этом случае мы хотим знать ориентацию устройства. Для отправки с уведомлением информация упакована в словарь.
Получение ориентации устройства
Чтобы получить ориентацию устройства, переопределите метод willAnimateRotationToInterfaceOrientation:duration:
введя следующий код внутри фигурных скобок. Каждый раз, когда устройство поворачивается, postNotificationWithString:
метод postNotificationWithString:
и он переходит в «Портрет» или «Пейзаж» в зависимости от ориентации устройства.
1
2
3
4
5
6
7
8
9
|
— (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
if (interfaceOrientation == UIInterfaceOrientationPortrait) {
[self postNotificationWithString:@»Portrait»];
}
else {
[self postNotificationWithString:@»Landscape»];
}
}
|
Использование уведомления
Пользовательский метод useNotificationWithString:
был объявлен ранее и зарегистрирован как селектор, вызываемый при получении уведомления. Введите следующий код, который получает строку ориентации устройства из userInfo
. Используя NSLog
для отображения его значения, каждое изменение ориентации регистрирует, что было опубликовано другое уведомление.
1
2
3
4
5
6
7
|
— (void)useNotificationWithString:(NSNotification *)notification //use notification method and logic
{
NSString *key = @»OrientationStringValue»;
NSDictionary *dictionary = [notification userInfo];
NSString *stringValueToUse = [dictionary valueForKey:key];
NSLog(@»Device orientation —> %@»,stringValueToUse);
}
|
Управление памятью
Наконец, наблюдатель должен быть удален, когда объект освобожден. Введите следующий код в методе dealloc
:
1
2
3
|
— (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
|
Если вы не используете ARC , вам также нужно явно вызвать [super dealloc]
, например так:
1
2
3
4
|
— (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
|
Шаг 4: Запустите проект
Выберите «Продукт»> «Выполнить» или нажмите стрелку «Выполнить» в верхнем левом углу. Если вы используете симулятор iOS, нажмите «Оборудование»> «Повернуть влево» для имитации вращения устройства. Обратите внимание, что «Ориентация устройства -> Пейзаж» записывается в консоль.
Вывод
Методы запуска в отключенных объектах потребовали бы некоторого здоровенного кодирования без уведомлений и NSNotificationCenter
. Добавляя наблюдателей для прослушивания определенных сообщений в центр уведомлений, ваши объекты могут легко общаться и передавать данные.