当某些事情发生时,我会在屏幕上的任何视图控制器的顶部显示自定义应用内通知。
点击它会触发通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"DidTapOnNotification" object:nil];
该特定通知的观察者是我的应用程序的根导航控制器,我将其子类化。我在viewDidLoad
中添加了addObserver。始终收到此通知,我在响应中运行的代码为:
[CATransaction begin];
[CATransaction setCompletionBlock:^{ // this is called when the popToRootViewController animation completes
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"NavigateToController" object:nil userInfo:notification.userInfo];
});
}];
[self popToRootViewControllerAnimated:YES];
[CATransaction commit];
我随意添加了一个延迟(dispatch_after)以查看我是否只需要让我的根视图控制器出现时间(我确认它在2秒之前出现)。
现在,再次在我的根视图控制器中,将其添加为NavigateToGroup
通知的观察者。即我在[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(openController:) name:@"NavigateToController" object:nil];
中致电viewDidLoad
。
问题在于并不总是调用选择器(即openController:
方法)。它被调用的唯一时间是当我点击应用程序内通知时我已经在该控制器(根控制器)上,然后它按预期工作。如果我在导航堆栈上有其他控制器,则按预期方式点击popToRoot,但是即使我确定通知已发布,方法openController:
也永远不会被调用(我确信视图出现时它确实)。
有谁知道这里发生了什么? 或者相反,任何人都可以推荐一种更好的处理方法吗?
答案 0 :(得分:0)
原来HariKrishnan.P的评论有一些道理。如果已经弹出了发送消息的视图控制器,则似乎不会发布NSNotifications。 (不确定这种情况是否总是如此,但在这里似乎确实如此)
我最终重构代码只发送一个初始通知然后通过使用委托并通过它明确地调用我的方法绕过它而不是依赖于NSNotification,这可能是一个更好的解决方案。