NSNotificationCenter - 观察者选择器被调用两次
NSNotificationCenter - Observer Selector Being Called Twice
我正在为 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)
}
如果我注释掉 viewWillAppear
中的 addObserver
行,则根本不会触发通知。我假设这意味着上面的一行代码是我为通知添加观察者的唯一地方,但它仍然被调用两次。
我的主视图控制器包含在容器视图控制器中。我认为这可能就是我的选择器被调用两次的原因,但我不确定。
我已经尝试了与此问题相关的主题的所有建议,但没有找到适合我的解决方案。
任何额外的见解将不胜感激!
编辑:
我在 AppDelegate 的 applicationDidBecomeActive
方法中发布通知。这是我的代码 (Objective-C):
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
}
此代码也只触发一次。
编辑#2:
我正在使用 viewWillAppear
和 viewWillDisappear
方法,因为我正在使用 UINavigationController
。我在导航堆栈中的每个视图控制器上向此通知添加和删除观察者。据我所知,如果我在 viewDidLoad
中添加观察者,这将不起作用。如果有更好的方法来解决这个问题,请告诉我!
有时您的视图控制器会出现两次。
即 viewWillAppear
被调用了两次。
尝试在 viewDidLoad
.
中添加观察者
...
编辑:不要 post 自己通知。 iOS post已经这样了。
Read here.
您可能希望在 viewDidLoad 中执行此操作,而不是在 viewWillAppear 中执行此操作。此外,viewWillAppear 可能会被调用两次而不会消失,从而为您提供 2 个观察者。不幸的是,您这里没有足够的代码来给出强有力的答案。
编辑:
我还没有足够的代表发表评论,我想看看你在哪里 post 发送通知,这可能是触发两次的原因。
编辑2:
是的,已经 post 编辑了该通知。通过 ios,您正在复制 post。
根据我的经验,您不应该依赖 -viewWillAppear:/-viewWillDisappear: 这些方法。并不总是足够好的保证它们会在您期望它们被调用一次并且调用将始终是平衡的。如果您从包含多个子视图的 xib 加载视图,则尤其如此。我可能会尝试将开始观察的调用移动到 -viewDidLoad 中并删除 -dealloc 上的观察者。
我正在为 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)
}
如果我注释掉 viewWillAppear
中的 addObserver
行,则根本不会触发通知。我假设这意味着上面的一行代码是我为通知添加观察者的唯一地方,但它仍然被调用两次。
我的主视图控制器包含在容器视图控制器中。我认为这可能就是我的选择器被调用两次的原因,但我不确定。
我已经尝试了与此问题相关的主题的所有建议,但没有找到适合我的解决方案。
任何额外的见解将不胜感激!
编辑:
我在 AppDelegate 的 applicationDidBecomeActive
方法中发布通知。这是我的代码 (Objective-C):
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
}
此代码也只触发一次。
编辑#2:
我正在使用 viewWillAppear
和 viewWillDisappear
方法,因为我正在使用 UINavigationController
。我在导航堆栈中的每个视图控制器上向此通知添加和删除观察者。据我所知,如果我在 viewDidLoad
中添加观察者,这将不起作用。如果有更好的方法来解决这个问题,请告诉我!
有时您的视图控制器会出现两次。
即 viewWillAppear
被调用了两次。
尝试在 viewDidLoad
.
...
编辑:不要 post 自己通知。 iOS post已经这样了。 Read here.
您可能希望在 viewDidLoad 中执行此操作,而不是在 viewWillAppear 中执行此操作。此外,viewWillAppear 可能会被调用两次而不会消失,从而为您提供 2 个观察者。不幸的是,您这里没有足够的代码来给出强有力的答案。
编辑: 我还没有足够的代表发表评论,我想看看你在哪里 post 发送通知,这可能是触发两次的原因。
编辑2: 是的,已经 post 编辑了该通知。通过 ios,您正在复制 post。
根据我的经验,您不应该依赖 -viewWillAppear:/-viewWillDisappear: 这些方法。并不总是足够好的保证它们会在您期望它们被调用一次并且调用将始终是平衡的。如果您从包含多个子视图的 xib 加载视图,则尤其如此。我可能会尝试将开始观察的调用移动到 -viewDidLoad 中并删除 -dealloc 上的观察者。