2013-05-29 2 views
1

Теперь я изучаю программирование уведомлений, у вас очень простой проект, есть два класса, которые имеют небольшие проблемы, которые не вызывают метод выбора уведомлений при отправке уведомления. Это очень странно, надеюсь кто-то поможет мне найти, где возникли проблемы, я очень благодарен за это!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 
+0

В чем проблема? – Undo

+0

Почему вы передаете себя как объект, кажется, что nil будет отлично работать как с отправителем, так и с приемником. – JeffN

+0

Вы уверены, что 'presentViewController' даже вызван? –

ответ

2

У вас есть 2 проблемы:

  1. проводка уведомления, прежде чем кто-то зарегистрировано, чтобы получить его.
  2. При добавлении наблюдателя вы фильтруете экземпляр, который не отправляет уведомление (object:self.viewController).

Для 1. Уведомления не хранятся, они принимаются только наблюдателями, прилагаемыми при отправке уведомления.

Для 2. Уведомления могут быть отправлены с объектом, и наблюдатели могут фильтровать на этом объекте. Если объекты не совпадают, метод не будет вызываться. Если вы не хотите, чтобы какая-либо фильтрация была сделана, установите объект на нуль.

Своп порядок вашего зрения контроллера представления и размещение извещения:

ViewController2 *viewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"viewController2"]; 

    [self presentViewController:viewController2 
        animated:YES 
        completion:^{ 
[[NSNotificationCenter defaultCenter] postNotificationName:@"networkNotification" 
                object:nil]; 
} 
+0

Несмотря на то, что OP может не нуждаться в фильтрации, мне кажется, что он использует один и тот же объект в обоих случаях, так что это не значит, что уведомление не проходит. Проблема (из последнего комментария OP) заключается в том, что метод, который публикует уведомление, никогда не вызывается вообще. –

+1

Между двумя контроллерами существует круговое окружение, поэтому трудно определить, одинаковы ли объекты. Наверное, нет. – Wain

+0

ах, ты прав, хорошо. Я уверен, что OP не означает, что вы создадите совершенно новый контроллер представления в viewDidLoad. –

2

Есть два вопроса, которые я нашел на код

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, здесь вы отправили уведомление, но нет получателя t текущий момент времени. Так что ничего не произойдет.

Проверка с:

- (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:.

+0

Спасибо! Я понимаю ваши средства, но что я должен делать для отправки уведомления после того, как кто-либо зарегистрирован, чтобы получить его в этом проекте? –

+0

@ Andy_24: Я не понял ваш комментарий. Во всяком случае, нет способа проверить, есть ли слушатель или нет. Для этой ситуации я добавил предложение выше. Пожалуйста, проверьте это, я не уверен, будет ли это работать или нет. –