Контроллеры представления иногда не получают NSNotification - PullRequest
0 голосов
/ 09 июня 2011

Итак, я просто тестирую NSNotifications в различных случаях, и это сбивает с толку.Буду признателен, если вы поможете мне понять NSNotifications!

У меня есть контроллер навигации.

У меня есть UIBarButtonItem под названием «Добавить», который отправляет уведомление DidAddNotification

Если я нажимаю «Добавить», это подталкивает меня к view2.

 // I add view2 as observer and write method for this and NSlog if it gets implemented //

Я снова подталкиваю себя к просмотру 3.

// I add view3 as another observer and use the same method as the previous view and I NSlog if it gets implemented//

Из Представления 3 я popToRootViewControllerAnimated: YES и возвращаюсь к 1. и снова следую той же процедуре.

Вот как выглядит элемент управления ...

1 -> 2 -> 3 -> 1

if I press add again,

the control is again the same 1 -> 2-> 3-> 1

Вот вывод (NSLogs) :

Я нажимаю кнопку Добавить в первый раз:

2011-06-09 14:47:41.912 Tab[5124:207]  I am the notification in view2
2011-06-09 14:47:41.912 Tab[5124:207]  I pressed Add Button and I just sent a notification from view 1
  // No notification in view 3 ?? //  I am now back to view 1.

Я нажимаю Добавить еще раз:

2011-06-09 14:47:51.950 Tab[5124:207] I am the notification in view3
2011-06-09 14:47:51.951 Tab[5124:207]  I pressed Add Button and I just sent a notification from view 1
 // No Notification in view 2 ??? // ... I am now back to view 1.

Я нажимаю Добавить еще раз:

2011-06-09 14:47:59.160 Tab[5124:207] I am the notification in view 3
2011-06-09 14:47:59.161 Tab[5124:207]  I pressed Add Button and I just sent a notification from view 1

 // No Notification in view 2 ??? //  ... I am now back to view 1.


And this goes on..

Может кто-нибудь сказать мне, почему

  1. NSLog не печатал в представлении 3 в первый раз, но печатает все в другое время?
  2. Почему NSLog печатает в представлении 2 в первый раз и никогда не печатает его снова?

Код:

[[NSNotificationCenter defaultCenter] postNotificationName:@"DidAddNotification" object:self];  // I put this in the - (IBAction) for addData

- (void)didPressAdd:(NSNotification *)notification { //NSLogs// }

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didPressAdd:) name:@"DidAddNotification" object:nil]; // I put this in the viewDidLoad of view 1 and view 2

Ответы [ 3 ]

3 голосов
/ 10 июня 2011

Различия, которые вы описываете, по-видимому, связаны с изменениями, в которых объекты живы, когда.Представления и контроллеры представлений не существуют бесконечно и не все создаются при запуске приложения.Объект должен существовать, чтобы получать и регистрировать уведомления.Базовая система уведомлений работает должным образом.

Вы сможете увидеть влияние времени жизни на полученные сообщения, если добавите операторы журнала, объявляющие о создании объекта, который должен получить одно из этих уведомлений, икогда он уничтожен в теле -init (или любого другого назначенного инициализатора вашего суперкласса) и -dealloc.

Кроме того: ваши операторы журнала будут легче отслеживать, если вы пометите их с помощьюфункция ведения журнала как NSLog(@"%s: <message>", __func__).Компилятор генерирует строку с именем __func__ для каждой функции, которая содержит имя функции.

1 голос
/ 14 июня 2011

"В первый раз, когда вы отправляете уведомление, другие контроллеры представления не существуют. Они еще не были созданы. ViewController все еще равен нулю. Поскольку объекта-наблюдателя нет, вы не получаете никаких журналовВо второй раз оба объекта в контроллерах представления были созданы. Таким образом, они получают уведомление, поскольку они живы, и регистрируют полученные уведомления. "

1 голос
/ 10 июня 2011

Я только что установил навигационное приложение.В заголовке корневого контроллера у меня есть это:

#import <UIKit/UIKit.h>

extern NSString * const EPNotification;

@interface RootViewController : UITableViewController {
}
@end

Все, что я действительно сделал по-другому, - это настройка строки для использования во всем коде.Затем в корневом файле реализации у меня есть это (плюс все стандартные вещи):

#import "RootViewController.h"
#import "One.h"

NSString *const EPNotification = @"Notification"; // this will be the global string name for the notification

@implementation RootViewController


#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(gotNotification:) name:EPNotification
                                           object:nil];

    UIBarButtonItem *next = [[UIBarButtonItem alloc] initWithTitle:@"next" style:UIBarButtonItemStylePlain                                                          target:self action:@selector(sendNotification)];

    self.navigationItem.rightBarButtonItem = next;
    [next release];
}

- (void)sendNotification {
    NSDictionary *d = [NSDictionary dictionaryWithObject:@"view 1" forKey:@"sender"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Notification" object:self userInfo:d];
    One *o = [[One alloc] initWithNibName:@"One" bundle:nil];
    [self.navigationController pushViewController:o animated:YES];
    [o release];
}

- (void)gotNotification:(NSNotification *)note {
    NSLog(@"from %@", [[note userInfo] objectForKey:@"sender"]);
}

У меня есть 3 других представления (Один, Два и Три, соответственно), которые почти все точнотот же самый.Ничего в шапке (кроме стандартных вещей).Я выложу один из файлов .m, чтобы вы могли увидеть настройки.

#import "One.h"
#import "Two.h"

@implementation One

- (void)viewDidLoad {
    [super viewDidLoad];
    UIBarButtonItem *next = [[UIBarButtonItem alloc] initWithTitle:@"next" style:UIBarButtonItemStylePlain
                                                     target:self action:@selector(sendNotification)];

    self.navigationItem.rightBarButtonItem = next;
    [next release];
}

- (void)sendNotification {
    NSDictionary *d = [NSDictionary dictionaryWithObject:@"view 2" forKey:@"sender"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Notification" object:self userInfo:d];
    Two *t = [[Two alloc] initWithNibName:@"Two" bundle:nil];
    [self.navigationController pushViewController:t animated:YES];
    [t release];
}

И, честно говоря, это почти все.В моем третьем классе я открываю корневой контроллер вместо создания нового контроллера представления, но это все.Он показывает, какой вид вы видите при каждом нажатии кнопки, поэтому, надеюсь, он поможет вам лучше понять, как работают уведомления.

...