#ios #objective-c #nsnotificationcenter
#iOS #objective-c #nsnotificationcenter
Вопрос:
Это мой код.
Здесь создайте наблюдателя для уведомления, вызываемого Example
в ViewController
- (void)addObserverExample
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(example:)
name:@"Example"
object:nil];
}
- (void)example:(NSNotification *)notification{
NSLog(@"Example!!!");
}
Из viewDidLoad
зарегистрируйте моего наблюдателя
- (void)viewDidLoad
{
[self addObserverExample];
}
В моем втором ViewController. При нажатии кнопки вызывается этот код:
[[NSNotificationCenter defaultCenter] postNotificationName:@"Example" object:self.dictKeys userInfo:nil];
Проблема, с которой я сталкиваюсь, заключается в том, что уведомление никогда не выполняется.
Есть идеи.
Комментарии:
1. Вы подтвердили, что вызов
postNotificationName
действительно выполнен? Находится ли наблюдающий контроллер представления все еще в памяти, когда второй контроллер представления отправляет уведомление?2. ДА. Когда в моем втором ViewController проверяется,
[NSNotificationCenter default]
Example
существует.3. 1. NSNotification. Имя (rawValue: «Пример») 2. Не регистрируйте объект уведомления с помощью viewDidLoad.
4. @ElTomato #2 — почему нет?
5. Вы уверены, что ваш
viewDidLoad
вызван? Например, если у вас есть производный контроллер, а код находится в вашем базовом контроллере представления, если вы забудете вызвать[super viewDidLoad]
в вашем производном контроллереviewDidLoad
, он не будет вызван. Можете ли вы проверить, что ваш код вызывается, установив точку останова?
Ответ №1:
Создал демо для NSNotificationCenter в соответствии с вашим вопросом, и у меня все работает нормально. Вот ссылка на этот код: Демо-версия NSNotificationCenter
- (void)viewDidLoad {
[super viewDidLoad];
[self addObserverExample];
}
- (void)addObserverExample
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(example:)
name:@"Example"
object:nil];
}
- (void)example:(NSNotification *)notification{
NSLog(@"Example!!!");
NSLog(@"%@",notification.userInfo);
}
- (IBAction)btnFireNotification:(id)sender {
[[NSNotificationCenter defaultCenter] postNotificationName:@"Example" object:nil userInfo:@{@"key" : @"value"}];
}
Комментарии:
1. Пожалуйста, дайте мне знать, работает ли это у вас. И если этот ответ помог вам, пожалуйста, помогите мне получить привилегии в этом сообществе. Заранее благодарю.
Ответ №2:
Я полагаю, что проблема, с которой вы столкнулись, может быть связана с тем фактом, что в вашем втором контроллере просмотра вы передаете self.dictKeys
в object
параметр. Если вы хотите передавать данные через NSNotificationCenter
, вам следует вместо этого использовать userInfo
параметр.
Пример Даршана делает это правильным образом.