[ios]ViewWillAppear 和 ViewWillDisapper NSNotificationCenter

发布时间: 2017/3/21 23:10:05
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有我想要侦听的简单 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];
}

我试图决定何时删除 viewController 作为通知中心观察员。 我只需要知道关于 UIKeyboardWillHideNotification viewcontroller 时在屏幕上,因此我想加入以下︰

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

是这足够吗?是否有过机会, viewDidUnloaddealloc 将会被调用,而是仍然在屏幕上的 viewController? 注意,我使用一个非常基本 UINavigationController 的我的应用程序流。

解决方法 1:

注册中的通知 viewWillAppear 和注销它在 viewWillDisappear 似乎是干净和对称的解决方案给我。

请注意, viewWillAppear 可以多次之前被调用 dealloc (例如如果另一个视图控制器推送上你的 VC,或者如果您切换选项卡栏控制器之间.)如果你注册在通知 viewWillAppear 和注销它只在 dealloc 然后你会得到 (比较的 iOS/iPhone 用户的重复 NSNotification 意见警告) 的重复登记和注册的选择器对于单个通知事件调用多次。

其实,我更喜欢基于数据块的观察员配准方法

addObserverForName:object:queue:usingBlock:

它返回一个不透明的对象是用于再次删除观察员。将该返回值存储到你的视图控制器的实例变量有助于保持跟踪,如果观察员已注册与否,并因此有助于避免重复登记。

赞助商