NSNotificationCenter - 被称为两次的观察者选择器

时间:2015-04-07 19:07:35

标签: ios swift selector nsnotificationcenter

我正在为UIApplicationDidBecomeActiveNotification创建通知,并且由于某种原因选择器被调用两次。这是我UIViewController中的代码:

 override func viewWillAppear(animated: Bool)
{
    super.viewWillAppear(animated)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: “selectorHere”, name: UIApplicationDidBecomeActiveNotification, object: nil)
}

override func viewWillDisappear(animated: Bool)
{
    super.viewWillDisappear(animated)

    NSNotificationCenter.defaultCenter().removeObserver(self)
}

如果我在addObserver中注释掉viewWillAppear行,则根本不会触发通知。我认为这意味着上面一行代码是我为通知添加观察者的唯一地方,但它仍然被调用了两次。

我的主视图控制器包含在容器视图控制器中。我想这可能就是我的选择器被调用两次的原因,但我不确定。

我已经尝试了与此问题相关主题的所有建议,但尚未找到适用于我的解决方案。

非常感谢任何其他见解!

编辑:

我在AppDelegate的applicationDidBecomeActive方法中发布通知。这是我的代码(Objective-C):

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
}

此代码也只触发一次。

编辑#2:

我使用的是viewWillAppearviewWillDisappear方法,因为我使用的是UINavigationController。我在导航堆栈中的每个视图控制器上添加和删除此通知的观察者。据我所知,如果我在viewDidLoad添加了观察者,这将无效。如果有更好的方法,请告诉我!

4 个答案:

答案 0 :(得分:3)

...

编辑:不要自己发布该通知。 iOS已发布此消息。 Read here.

答案 1 :(得分:0)

可能存在视图控制器出现两次的情况。 即viewWillAppear被叫两次。 尝试在viewDidLoad中添加观察者。

答案 2 :(得分:0)

您可能希望在viewDidLoad中执行此操作,而不是viewWillAppear。此外,viewWillAppear可能会被调用两次而不会消失,为您提供2个观察者。不幸的是,您没有足够的代码来提供强有力的答案。

编辑: 我还没有足够的回复评论,我想看看你在哪里发布通知,这可能是两次发射。

编辑2: 是的,该通知已经发布。通过ios,你正在复制帖子。

答案 3 :(得分:0)

根据我的经验,你不应该依赖-viewWillAppear:/ - viewWillDisappear:对于这些方法。总是有一个足够好的保证,它们将被调用一次,当你期望它们时,它们将始终是平衡的。如果从包含多个子视图的xib加载视图,则尤其如此。我可能会尝试移动调用以开始观察-viewDidLoad并删除-dealloc上的观察者。