我正在为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:
我使用的是viewWillAppear
和viewWillDisappear
方法,因为我使用的是UINavigationController
。我在导航堆栈中的每个视图控制器上添加和删除此通知的观察者。据我所知,如果我在viewDidLoad
添加了观察者,这将无效。如果有更好的方法,请告诉我!
答案 0 :(得分:3)
...
编辑:不要自己发布该通知。 iOS已发布此消息。 Read here.
答案 1 :(得分:0)
可能存在视图控制器出现两次的情况。
即viewWillAppear
被叫两次。
尝试在viewDidLoad
中添加观察者。
答案 2 :(得分:0)
您可能希望在viewDidLoad中执行此操作,而不是viewWillAppear。此外,viewWillAppear可能会被调用两次而不会消失,为您提供2个观察者。不幸的是,您没有足够的代码来提供强有力的答案。
编辑: 我还没有足够的回复评论,我想看看你在哪里发布通知,这可能是两次发射。
编辑2: 是的,该通知已经发布。通过ios,你正在复制帖子。
答案 3 :(得分:0)
根据我的经验,你不应该依赖-viewWillAppear:/ - viewWillDisappear:对于这些方法。总是有一个足够好的保证,它们将被调用一次,当你期望它们时,它们将始终是平衡的。如果从包含多个子视图的xib加载视图,则尤其如此。我可能会尝试移动调用以开始观察-viewDidLoad并删除-dealloc上的观察者。