在标签栏(视图控制器)中多次调用通知中心方法方法 ios?如何删除观察者?
Notification center method method called multiple time ios in Tab bar (View controller)? How to remove observer?
我正在从一个视图控制器发布通知,它位于标签栏应用程序的导航堆栈中。我正在删除 dealloc 中的观察者。
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"ArtworkAddedReloadAllArtworks" object:nil]; in dealloc correctly.
我正在注销
[[self tabBarController] dismissViewControllerAnimated:YES completion:nil];
但问题是当我重新登录时添加了两次与通知中心相同的通知
ArtworkAddedReloadAllArtworks, 0x12ff698, 0x7a490e00, 1400
ArtworkAddedReloadAllArtworks, 0x12ff698, 0x7a431800, 1400
在通知中心创建了 2 个视图控制器实例,并且通知添加了两次两个不同的对象,如何注销通知?我无法从 viewDidDisappear 中删除,因为我发布来自其他 controller.dealloc 的通知在登录后调用。
如何制作nil view controller(登录前先创建),以及他的观察者?
提前致谢。
请检查 Interface Builder 中的 reuseIdentifier
。如果你设置它,UIViewController
可以调用 viewDidLoad
多次并且只能调用一次 - dealloc
。
请检查。
解决方案:
将 adding/removing 个观察者移动到 viewWillAppear
和 viewWillDisappear
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someSelector:) name:@"ArtworkAddedReloadAllArtworks" object:nil];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"ArtworkAddedReloadAllArtworks" object:nil];
}
另一个解决方案(我不喜欢它,但它可以帮助):
在 viewDidLoad
中删除观察者,然后再添加观察者
- (void)viewDidLoad {
[super viewDidLoad];
// Remove previously added observer to avoid of duplicate
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"ArtworkAddedReloadAllArtworks" object:nil];
// Add new observer
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someSelector:) name:@"ArtworkAddedReloadAllArtworks" object:nil];
}
NSNotificationCenter.defaultCenter().removeObserver(self, name : UIKeyboardWillShowNotification, object: nil)
在这种情况下,任何侦听 'UIKeyboardWillShowNotification' 的观察者都将从您所在的视图控制器中删除。
如果发布 class 和观察 class 不同,我无法在观察 class 中删除观察者。
例如。在 Class 中添加了一个名为观察者的 viewWillAppear,现在我推送到 Class B 然后 Class A 的 viewWillDisappear 被调用并且观察者被删除,现在通知不会被 Class A 观察到它在推送操作时在 viewWillDisappear 中被删除。
我认为这不是正确的解决方案,但我最终通过保存观察者 class 引用并使用它来删除引用。
Class viewDidLoad方法中的A(观察Class)
[[ASNGlobalClass shareManager] setNotificationSelf:self];//Save reference of self
Class B(任意 Class)
[[NSNotificationCenter defaultCenter] removeObserver:[[ASNGlobalClass shareManager] notificationSelf]
name:@"LookbookChangeNotification"
object:nil];
我正在从一个视图控制器发布通知,它位于标签栏应用程序的导航堆栈中。我正在删除 dealloc 中的观察者。
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"ArtworkAddedReloadAllArtworks" object:nil]; in dealloc correctly.
我正在注销
[[self tabBarController] dismissViewControllerAnimated:YES completion:nil];
但问题是当我重新登录时添加了两次与通知中心相同的通知
ArtworkAddedReloadAllArtworks, 0x12ff698, 0x7a490e00, 1400
ArtworkAddedReloadAllArtworks, 0x12ff698, 0x7a431800, 1400
在通知中心创建了 2 个视图控制器实例,并且通知添加了两次两个不同的对象,如何注销通知?我无法从 viewDidDisappear 中删除,因为我发布来自其他 controller.dealloc 的通知在登录后调用。
如何制作nil view controller(登录前先创建),以及他的观察者?
提前致谢。
请检查 Interface Builder 中的 reuseIdentifier
。如果你设置它,UIViewController
可以调用 viewDidLoad
多次并且只能调用一次 - dealloc
。
请检查。
解决方案:
将 adding/removing 个观察者移动到 viewWillAppear
和 viewWillDisappear
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someSelector:) name:@"ArtworkAddedReloadAllArtworks" object:nil];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"ArtworkAddedReloadAllArtworks" object:nil];
}
另一个解决方案(我不喜欢它,但它可以帮助):
在 viewDidLoad
中删除观察者,然后再添加观察者
- (void)viewDidLoad {
[super viewDidLoad];
// Remove previously added observer to avoid of duplicate
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"ArtworkAddedReloadAllArtworks" object:nil];
// Add new observer
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someSelector:) name:@"ArtworkAddedReloadAllArtworks" object:nil];
}
NSNotificationCenter.defaultCenter().removeObserver(self, name : UIKeyboardWillShowNotification, object: nil)
在这种情况下,任何侦听 'UIKeyboardWillShowNotification' 的观察者都将从您所在的视图控制器中删除。
如果发布 class 和观察 class 不同,我无法在观察 class 中删除观察者。
例如。在 Class 中添加了一个名为观察者的 viewWillAppear,现在我推送到 Class B 然后 Class A 的 viewWillDisappear 被调用并且观察者被删除,现在通知不会被 Class A 观察到它在推送操作时在 viewWillDisappear 中被删除。
我认为这不是正确的解决方案,但我最终通过保存观察者 class 引用并使用它来删除引用。
Class viewDidLoad方法中的A(观察Class)
[[ASNGlobalClass shareManager] setNotificationSelf:self];//Save reference of self
Class B(任意 Class)
[[NSNotificationCenter defaultCenter] removeObserver:[[ASNGlobalClass shareManager] notificationSelf]
name:@"LookbookChangeNotification"
object:nil];