我在一个视图控制器中发布通知,该控制器位于标签栏应用程序的导航堆栈中。我正在删除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视图控制器(在登录前首先创建)和他的观察者?
提前致谢。
答案 0 :(得分:0)
请在Interface Builder中查看<Window>
<Window.Resources>
<Style x:Key="yourStyle" TargetType="Button">
<Setter Property="Background" Value="Green" />
<Setter Property="FontStyle" Value="Italic" />
<Setter Property="Padding" Value="8,4" />
<Setter Property="Margin" Value="4" />
</Style>
</Window.Resources>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<Button Style="{StaticResource yourStyle}">Express</Button>
<Button >yourself</Button>
<Button Style="{StaticResource yourStyle}">by Style</Button>
</StackPanel>
。如果您进行了设置,则reuseIdentifier
可以多次拨打UIViewController
并且只能呼叫一次viewDidLoad
。
请检查一下。
解决方案:
将添加/删除观察者移至dealloc
和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
答案 1 :(得分:0)
NSNotificationCenter.defaultCenter().removeObserver(self, name : UIKeyboardWillShowNotification, object: nil)
在这种情况下,任何侦听'UIKeyboardWillShowNotification'的观察者都将从您所在的视图控制器中删除。
答案 2 :(得分:0)
如果发布类和观察类不同,那么我无法在Observing类中删除观察者。
实施例。在A类viewWillAppear中调用了observer,现在我推送到B类,然后调用Class A的viewWillDisappear,并且观察者现在被删除了,因为在推送操作时,在ViewWillDisappear中删除了A类,因此它不会被A类观察到。
我认为这不是正确的解决方案,但我最终通过保存观察者类引用并使用它来删除引用。
viewDidLoad方法中的A类(观察类)
[[ASNGlobalClass shareManager] setNotificationSelf:self];//Save reference of self
B类(任何类别)
[[NSNotificationCenter defaultCenter] removeObserver:[[ASNGlobalClass shareManager] notificationSelf]
name:@"LookbookChangeNotification"
object:nil];