【问题标题】:NSNotification Center only works in second time? TabbarController to NavigationControllerNSNotification Center 只能在第二次工作? TabbarController 到 NavigationController
【发布时间】:2016-08-18 09:29:02
【问题描述】:

场景我有两个视图控制器:Tabcontroller 和 Viewcontroller。在第一个中,我定义了我的发布通知,在第二个中,我添加了一个带有接收方法的观察者。

在我的 tabcontroller(发件人)上:

-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item{

[[NSNotificationCenter defaultCenter] postNotificationName:@"RestartBtn" object:self userInfo:@{@"isHidden": @"YES"}];

}

在视图控制器(接收器)上:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"HallOfFameView");
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"RestartBtn" object:nil];

}
-(void)receiveNotification:(NSNotification*)notification {

    NSLog(@"%@",[notification name]);
    _restartbutton.hidden=YES;
    NSLog(@"%@",notification.userInfo[@"isHidden"]);
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
    [notificationCenter removeObserver:self name:@"RestartBtn" object:nil];
    }

当我点击我的 tabbaritem 时,它会推送一个视图控制器,它会打印“HallOfFameView”,我相信这会注册观察者,但不会在第一次执行接收通知方法,只是在第二次。例如,当我单击标签栏项目(“主页”)时,它将执行接收通知方法。

为什么第一次没有工作?以及为什么它已经从我期望工作的视图控制器退出(这是我添加观察者的地方)。

【问题讨论】:

  • 以下我的回答有效吗?

标签: ios objective-c nsnotificationcenter nsnotifications


【解决方案1】:
  1. 你是对的。视图控制器正在注册通知,但它没有收到通知。在视图控制器存在并注册之前,该通知已由标签栏控制器触发。

  2. 标签栏控制器正在为每个被选中的标签发布通知。因此,当您点击另一个标签栏项目时,通知会被发布,此时视图控制器 已 存在并接收它。

看起来您正在尝试将信息从标签栏控制器传递到视图控制器。可能有更好的方法来做到这一点。

如果您使用情节提要,则标签栏控制器将使用 segue 移动到视图控制器场景。您可以考虑在标签栏控制器上覆盖此方法:- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender,这将使您有机会在“目标视图控制器”上设置属性。

【讨论】:

  • 谢谢我现在明白了。事实上,您首先必须添加一个观察者,然后您才能发布信息。没有观察者,消息就会消失。 NSnotifications 的结论我总是必须在发布通知之前添加观察者。对未来不利,您将需要始终加载视图以首先添加观察者...
  • 是的,您甚至无法确定加载视图需要多长时间。您可以查看在选项卡栏控制器上覆盖此方法。 -(void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController .... 你可以检查 viewController 是否是你想要的视图控制器的类,然后在那里设置一个属性。不同的方法来做到这一点。
  • 是的,我相信 prepareForSegue 不起作用,更好的方法似乎是你说的使用`-(void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController`。你同意?如果是,您可以编辑您的答案。
【解决方案2】:

将您添加的观察者编码放在 viewWillAppear 方法中,并在 viewWillAppear 中删除观察者

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

【讨论】:

  • 不适合我.. 我在 receiveNotification 方法中使用了类似的方法,但我相信我的问题是我没有正确使用 NSNotification 因为我必须首先定义一个观察者然后向该观察者发布通知。
  • 非常感谢您的帮助,但我已经使用 -(void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 代替。它对我来说很好用!
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
相关资源
最近更新 更多