iOS NSNotification Простые проблемы проекта Xcode
Сейчас я изучаю программирование уведомлений, у меня очень простой проект, есть два класса, в которых есть небольшие проблемы, которые не вызывают метод выбора уведомлений при публикации уведомлений. Это очень странно, надеюсь, кто-нибудь поможет мне найти, где возникли проблемы, я очень ценю это!
Мой исходный код:
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIButton *pushButton;
- (IBAction)presentViewController:(id)sender;
@end
ViewController.m
#import "ViewController.h"
#import "ViewController2.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (IBAction)presentViewController:(id)sender
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"networkNotification"
object:self];
ViewController2 *viewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"viewController2"];
[self presentViewController:viewController2
animated:YES
completion:nil];
}
@end
ViewController2.h
#import <UIKit/UIKit.h>
@class ViewController;
@interface ViewController2 : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *testLabel;
@property (nonatomic, strong) ViewController *viewController;
@end
ViewController2.m
#import "ViewController2.h"
#import "ViewController.h"
@interface ViewController2 ()
@end
@implementation ViewController2
@synthesize testLabel;
- (void)viewDidLoad
{
[super viewDidLoad];
self.viewController = [[ViewController alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(recievingNotifications:)
name:@"networkNotification"
object:self.viewController];
}
- (void)recievingNotifications:(NSNotification *)aNotification
{
if ([[aNotification name] isEqualToString:@"networkNotification"])
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
self.testLabel.text = @"Good";
}
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"networkNotification"
object:self.viewController];
}
@end
2 ответа
У вас есть 2 проблемы:
- Вы публикуете уведомление до того, как кто-либо зарегистрировался для его получения.
- При добавлении наблюдателя вы фильтруете экземпляр, который не публикует уведомление (
object:self.viewController
).
Для 1. Уведомления не сохраняются, они принимаются только наблюдателями, прикрепленными при публикации уведомления.
Для 2. Уведомления могут быть отправлены с объектом, и наблюдатели могут фильтровать по этому объекту. Если объекты не совпадают, метод не будет вызван. Установите объект равным nil при наблюдении, если вы не хотите выполнять фильтрацию.
Поменяйте местами порядок представления вашего контроллера представления и размещения уведомлений:
ViewController2 *viewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"viewController2"];
[self presentViewController:viewController2
animated:YES
completion:^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"networkNotification"
object:nil];
}
В вашем коде я обнаружил две проблемы
1)
- (IBAction)presentViewController:(id)sender
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"networkNotification"
object:self];
ViewController2 *viewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"viewController2"];
[self presentViewController:viewController2
animated:YES
completion:nil];
}
Здесь вы размещаете уведомление, а затем отображает ViewController2
здесь вы отправили уведомление, но в текущий момент времени получатель недоступен. Так что ничего не случится.
Проверить с:
- (IBAction)presentViewController:(id)sender
{
ViewController2 *viewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"viewController2"];
[self presentViewController:viewController2
animated:YES
completion:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"networkNotification"
object:self];
}
2)
- (void)viewDidLoad
{
[super viewDidLoad];
self.viewController = [[ViewController alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(recievingNotifications:)
name:@"networkNotification"
object:self.viewController];
}
Почему вы снова выделяете ViewController
?
Просто передайте это от presentViewController:
метод.