在我的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工作。)
我需要做些什么特别的事吗?
答案 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];