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 проблемы:

  1. Вы публикуете уведомление до того, как кто-либо зарегистрировался для его получения.
  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: метод.

Другие вопросы по тегам