NSNotification只有NSLog有效

时间:2012-01-30 23:01:30

标签: iphone objective-c xcode nsnotificationcenter nsnotification

在我的Class X中,我发布了这样的通知:

[[NSNotificationCenter defaultCenter] addObserver:viewController 
                                             selector:@selector(doThis:) 
                                                 name:@"myNotification" 
                                               object:nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:nil];

在我的Y班级,我这样收到:

- (void) doThis: (NSNotification *) notification {
NSLog(@"It works.");
[uiTextView resignFirstResponder]; }

控制台显示NSLog消息,但我的UITextView不会隐藏其键盘。 (例如viewDidLoad resignFirstResponder / becomeFirstResponder工作。)

我需要做些什么特别的事吗?

2 个答案:

答案 0 :(得分:3)

FWIW,在大多数情况下,但并非所有情况下,观察者应该由观察者本身添加和删除,而不是由单独的对象添加和删除。 (如果观察者在单独的对象之前消失,并且没有正确地移除观察者,会发生什么?反之亦然?这使得观察者泄漏或者对解除分配的对象的通知崩溃都很容易。)

无论如何,第一件事是第一件事:你确认uiTextView不是零并指向第一响应者吗?我宁愿怀疑uiTextView不是你想象的那样。

答案 1 :(得分:2)

正如康拉德所说,观察员应该自己添加和删除......

使用最佳实践将通知的名称定义为静态常量,如下所示:

static NSString *const kMyNotification = @"myNotification";

为什么?因为存在@“myNotification”可能是两个不同对象的风险,然后notificationName不同,您将不会收到通知。由于我总是将它们声明为静态常量,因此我从未遇到过NSNotifications的问题。

然后像这样使用它:

注册观察员

[[NSNotificationCenter defaultCenter] addObserver: self 
                                         selector: @selector(doThis:) 
                                             name: kMyNotification 
                                           object: nil];

发布通知

[[NSNotificationCenter defaultCenter] postNotificationName: kMyNotification 
                                                    object: nil];

删除观察者:

[[NSNotificationCenter defaultCenter] removeObserver: self];