0

在我的 XI 类中发布这样的通知:

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

在我的课堂上,我是这样收到的:

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

控制台显示 NSLog 消息,但我的 UITextView 没有隐藏它的键盘。(例如在 viewDidLoad 中 resignFirstResponder/becomeFirstResponder 有效。)

我有什么特别需要做的吗?

4

2 回答 2

3

FWIW,在大多数(但不是全部)情况下,观察者应该由观察者本身添加和删除,而不是由单独的对象。(如果观察者在单独的对象之前离开,并且未能正确删除观察者会发生什么?反之亦然?这使得泄漏观察者或在通知释放对象时崩溃变得太容易了。)

无论如何,第一件事是第一件事:您是否验证 uiTextView 不是 nil 并指向第一响应者?我宁愿怀疑 uiTextView 不是你想象的那样。

于 2012-01-30T23:11:54.983 回答
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];
于 2012-01-30T23:43:59.863 回答