我有两个观点,当您从一个切换到另一个时,它们会调用一个通知到即将加载以刷新内容的视图。奇怪的是,第一次加载视图时,它会调用它一次,下一次调用两次,以此类推。我的结论是,这是因为每次视图加载时,它们都会被添加。因为dealloc永远不会被调用,它仍然在那里,它将继续添加现在。
那么,在添加解决此问题之前,是否有一种方法可以检查通知是否存在?
这里是我的viewDidLoad
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReloadGridNotification:) name:@"ReloadOHGridView" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReloadBadgeNotification:) name:@"reloadBadge" object:nil];我的命:
[[NSNotificationCenter defaultCenter] removeObserver:self];谢谢!
库尔顿
编辑1:
我在UINavigationController中显示我的视图,并在它们之间切换。下面是我刷新不同视图的代码:
- (void)viewWillDisappear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadBadge" object:self];
}发布于 2011-04-18 00:53:13
每次调用addObserver时,通知中心都会向其内部结构添加一个条目。这意味着每次调用viewDidLoad时,通知中心都会再次调用您的观察者。
如果您的视图因任何原因被卸载,然后重新加载,那么viewDidLoad将再次被调用。在对象被销毁之前,您的远程观察者将不会被调用,这可能解释了为什么您的远程观察者没有工作。
您应该检查是否已经使用标志调用了addObserver,或者在卸载viewDidUnload方法中的视图时手动删除带有removeObserver的观察者。
Edit1:或者,你能在其他地方添加观察者吗,比如在App中?
发布于 2011-04-18 01:21:59
当内存紧张时,操作系统将转储您的视图,但首先调用viewDidUnload;当不得不重新加载它们时,它将调用viewDidLoad。然而,只有当所有对您的视图的引用都已经发布时,dealloc才会被调用,这很可能在应用程序退出之前不会发生。
因此,正如@futureelite7 7所指出的,每次重新加载视图时,您都会添加一个新的观察者,但实际上从未删除它。
您所需要做的就是确保观察者在viewDidLoad中添加,在viewDidUnload中删除,这样就不会出现多个通知问题。不需要国旗,也不需要把观察者放在其他地方。
从您的评论中可以看出,您可能已经尝试过了,但我建议您检查代码,确保您只在DidLoad中添加它们,并且总是在DidUnload中删除它们。它就像一个又一个应用程序的魅力。
编辑以添加
因为您的视图一直处于卸载状态,只有在手动执行、所有对其的引用丢失或内存紧张的情况下才会发生这种情况,因此我建议查看这三个视图,以帮助确保您正在尽您所能地保持视图。
https://stackoverflow.com/questions/5697438
复制相似问题