关于ViewWillAppear和ViewWillDisapper的NSNotificationCenter

Nos*_*tap 2 iphone objective-c nsnotificationcenter viewwillappear ios

我有一个简单的viewController,我想听UIKeyboardWillHideNotification.因此我有以下代码:

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillBeHidden)
                                                 name:UIKeyboardWillHideNotification object:nil];
}

- (void) keyboardWillBeHidden
{
    [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试决定何时删除viewController作为通知中心观察者.我只需要了解UIKeyboardWillHideNotificationviewcontroller何时在屏幕上,因此我正在考虑添加以下内容:

- (void) viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
Run Code Online (Sandbox Code Playgroud)

这够了吗?在viewController仍在屏幕上时,是否有可能viewDidUnloaddealloc将被调用? 请注意,我正在使用非常基本UINavigationController的应用程序流程.

Mar*_*n R 5

在通知中注册通知viewWillAppear并取消注册通知viewWillDisappear对我来说似乎是一个干净且对称的解决方案.

请注意,之前viewWillAppear可以多次调用dealloc(例如,如果将另一个视图控制器推送到VC​​上,或者如果您在标签栏控制器之间切换.)如果您viewWillAppear只在dealloc那里注册通知并取消注册,那么您将获得重复注册(比较警告)对于iOS/iPhone用户关于重复的NSNotification观察),并且对于单个通知事件多次调用已注册的选择器.

我实际上更喜欢基于块的观察者注册方法

addObserverForName:object:queue:usingBlock:
Run Code Online (Sandbox Code Playgroud)

返回一个不透明的对象,用于再次移除观察者.将此返回值存储到视图控制器的实例变量中有助于跟踪观察者是否已注册,因此有助于避免重复注册.