5

我正在添加一个视图控制器作为UIKeyboardWillShowNotification通知的观察者。

我的代码中有此代码viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self
                                     selector:@selector(keyboardWillShow:)
                                         name:UIKeyboardWillShowNotification
                                       object:nil];

在我的dealloc

[[NSNotificationCenter defaultCenter] removeObserver:self];

即使dealloc在关闭视图控制器时调用观察者,也不会删除观察者。所以当我第二次打开它时,NSNotificationCenter 会尝试通知旧对象,该对象被释放,应用程序崩溃。

我在 StackOverflow 上看到了几个关于这个特定问题的问题,但没有一个答案对我有用。

我试过移除观察者viewWillDisappearviewDidDisappear但同样的问题发生了。

我正在使用ARC。

4

4 回答 4

1

你试过这个确切的代码块viewWillDisappear吗?

- (void)viewWillDisappear:(BOOL)animated 
{
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

根据您的解释,我认为问题不在于移除观察者。尝试从另一个视图控制器触发观察者。如果它没有被触发,您将知道删除成功,并且当您第二次添加观察者时会出现问题。

于 2013-08-23T12:01:43.363 回答
0

看起来观察者被设置了多次。您的控制器是否继承自一个也注册相同通知的类?这可能导致控制器实例多次注册为观察者。作为一种解决方法,请在添加观察者的控制器类中尝试此操作,

// Remove as observer first
[[NSNotificationCenter defaultCenter] removeObserver:self];
                                      name:UIKeyboardWillShowNotification
                                      object:nil];
// Then add
[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(keyboardWillShow:)
                                      name:UIKeyboardWillShowNotification
                                      object:nil];

这将确保观察者只被添加一次。

希望有帮助!

于 2013-08-23T12:41:57.737 回答
0

也许尝试通过指定name您之前设置的参数,如下所示:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
于 2013-08-23T12:30:18.883 回答
0
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"name" object:nil];

它适用于我

于 2013-08-23T13:12:07.523 回答