我正在添加一个视图控制器作为UIKeyboardWillShowNotification
通知的观察者。
我在viewDidLoad
:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
在我的dealloc
:
[[NSNotificationCenter defaultCenter] removeObserver:self];
即使在视图控制器关闭时调用dealloc
,也不会删除观察者。因此,当我第二次打开它时,NSNotificationCenter将尝试通知已发布的旧对象,并且应用程序崩溃。
我在StackOverflow上看到了几个关于这个特殊问题的问题,但没有答案对我有用。
我已尝试删除viewWillDisappear
和viewDidDisappear
中的观察者,但同样的问题也会发生。
我正在使用ARC。
答案 0 :(得分:1)
您是否在viewWillDisappear
?
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
根据你的解释,我认为问题不在于移除观察者。 尝试从另一个viewcontroller触发Observer。如果未触发,您将知道删除成功,并且在第二次添加观察者时会出现问题。
答案 1 :(得分:0)
也许请尝试指定之前设置的参数name
,如下所示:
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
答案 2 :(得分: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];
这将确保观察者只被添加一次。
希望有所帮助!
答案 3 :(得分:0)
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"name" object:nil];
它适用于我