【问题标题】:NSNotificationCenter calling two timesNSNotificationCenter 调用两次
【发布时间】:2015-01-20 17:34:44
【问题描述】:

以下是我所拥有的。

MainViewController.m

- (IBAction)sideMenuAction:(id)sender {
    NSLog(@"login==sideMenuAction");
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ShowMySideMenuNotification" object:self];
}

NotificationListener.m

-(void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ShowMySideMenuNotification" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(adjustShowMenu) name:@"ShowMySideMenuNotification" object:nil];
}

-(void) adjustShowMenu {
    NSLog(@"notification adjustShowMenu=");
}

现在,当我单击 MainViewController 中的侧菜单按钮时,我期待的是从 NotificationListener 调用 adjustShowMenu 一次,但是它被调用了两次。

下面是相同的 NSLog。

2015-01-20 12:27:30.798 abc[699:169314] login==sideMenuAction
2015-01-20 12:27:30.798 abc[699:169314] notification adjustShowMenu=
2015-01-20 12:27:30.799 abc[699:169314] notification adjustShowMenu=

我期待的是

2015-01-20 12:27:30.798 abc[699:169314] login==sideMenuAction
2015-01-20 12:27:30.798 abc[699:169314] notification adjustShowMenu=

知道出了什么问题吗?

注意:我也试过用 viewDidAppear 代替 viewDidLoad,但结果相同。

当我在网上搜索时,很多答案都要求删除Observer。我做了同样的事情,但仍然有两次通知被调用。

【问题讨论】:

  • 您确定只有一个 NotificationListener 实例吗?我怀疑肯定还有一个
  • 这不是您添加/删除观察者的方式。您需要在需要时添加它,并在完成时将其删除,例如,将其添加到 viewWillAppear 并删除 viewWillDisappearviewDidLoad / dealloc
  • 嗨,请按照这个答案解决我的问题。 stackoverflow.com/a/7751272/5581345

标签: ios objective-c nsnotificationcenter nsnotifications


【解决方案1】:

根据answer here,我进行了如下更改,现在可以正常工作了。

-(void) viewWillAppear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(adjustShowMenu) name:@"ShowMySideMenuNotification" object:nil];
}

-(void) viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ShowMySideMenuNotification" object:nil];
}

【讨论】:

  • 这是一种更好的处理方式,因为当从这个视图控制器调用更多视图控制器并且当这个视图控制器(在后台不可见但仍然存在)不想要这些视图控制器时,它会起作用不可见时的通知。如果视图控制器在不可见但处于活动状态时仍需要通知,那么您的建议将不起作用。但是:这如何解决他两次调用选择器的实际问题?
  • @HermannKlecker : bcz 在进入这个视图控制器(登录)之前我还有一个视图控制器(语言)... 2 vc,所以 2 个通知
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多