在标签栏(View controller)中调用多个时间ios的通知中心方法方法?如何删除观察者?

时间:2015-11-06 11:37:48

标签: ios objective-c swift notifications

我在一个视图控制器中发布通知,该控制器位于标签栏应用程序的导航堆栈中。我正在删除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视图控制器(在登录前首先创建)和他的观察者?

提前致谢。

3 个答案:

答案 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。 请检查一下。

解决方案:

将添加/删除观察者移至deallocviewWillAppear

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];