繁体   English   中英

通知中心方法在Tab栏(视图控制器)中称为多次时间ios的方法? 如何删除观察者?

[英]Notification center method method called multiple time ios in Tab bar (View controller)? How to remove observer?

我要在表单视图栏应用程序的导航堆栈中发布一个视图控制器的通知表单。 我在dealloc as中删除观察者。

 [[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

在通知中心中创建了View Controller的实例2,并且两次将通知添加到两个不同的对象中,如何注销通知? 我无法从viewDidDisappear中删除,因为我在登录后从其他controller.dealloc调用中发布通知。

如何使nil视图控制器(在登录之前首先创建)及其观察者?

提前致谢。

请检查Interface Builder中的reuseIdentifier 如果设置它,则UIViewController可以多次调用viewDidLoad ,并且只能调用一次dealloc 请检查一下。

解:

将添加/删除观察者移动到viewWillAppearviewWillDisappear

- (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”的观察者都将从您所在的视图控制器中删除。

如果发布类和观察类不同,那么我无法在观察类中删除观察者。

防爆。 在添加了名为观察者的A类viewWillAppear中,现在我推送至类B,然后调用类A的viewWillDisappear,并且观察者已被移除,因为在推送操作期间已在viewWillDisappear中将其移除,因此A类将无法观察到通知。

我认为这不是适当的解决方案,但我最终通过保存观察者类引用并将其用于删除引用。

viewDidLoad方法中的A类(观察类)

  [[ASNGlobalClass shareManager] setNotificationSelf:self];//Save reference of self

B班(任何班)

[[NSNotificationCenter defaultCenter] removeObserver:[[ASNGlobalClass shareManager] notificationSelf]
                                                    name:@"LookbookChangeNotification"
                                                  object:nil];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM