【问题标题】:postNotificationName is not yet trigger in appdelegate classpostNotificationName 尚未在 appdelegate 类中触发
【发布时间】:2016-09-14 17:00:12
【问题描述】:

在 Appdelegate.m 中添加 postNotification 方法

   - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

         if(application.applicationState == UIApplicationStateBackground) {

[[NSNotificationCenter defaultCenter] postNotificationName: @"SuggetionPushNotification" object:nil userInfo:userInfo];


              AppDelegate *appDel = (AppDelegate *)[[UIApplication sharedApplication] delegate];

                        SideMenuViewController *leftMenuViewController = [[SideMenuViewController alloc] init];
                        MFSideMenuContainerViewController *container = [MFSideMenuContainerViewController
                                                                        containerWithCenterViewController:[[UINavigationController alloc]
                                                                                                           initWithRootViewController:[[SuggetionViewController alloc] init]]
                                                                        leftMenuViewController:leftMenuViewController
                                                                        rightMenuViewController:Nil];

                         [self.window makeKeyAndVisible];
                        appDel.window.rootViewController = container;

                 }


                    }

ViewController B (SuggetionViewController) 在 vi​​ewDidLoad

   [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(receiveTestNotification:)
                                                 name:@"SuggetionPushNotification"
                                               object:nil];



- (void) receiveTestNotification:(NSNotification *) notification {
    NSLog(@"working");

}

但是这里还没有触发通知,如果在同一个类中添加了 post 和 addobserver,那么只有它会触发。我做错了什么。我来自Send and receive messages through NSNotificationCenter in Objective-C?请帮忙

【问题讨论】:

标签: ios objective-c push-notification nsnotificationcenter mfslidemenu


【解决方案1】:

在任何视图/视图控制器层次结构发生更改以实例化和加载之前,您正在从应用委托中的启动方法调用通知。您没有收到通知的原因是您的 SuuggetionViewController 尚未实例化。如果您希望收到通知,则需要在视图控制器获得要创建的更改后触发它。

【讨论】:

  • 在加载 SuuggetionViewController 后它还不会添加观察者不会触发。
  • 能做什么请建议
【解决方案2】:

当您发布通知时,您的视图控制器 B 不在内存中,这就是控制器 B 无法观察通知的原因。在发布通知之前添加延迟会有所帮助。

double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
  [[NSNotificationCenter defaultCenter] postNotificationName: @"SuggetionPushNotification" object:nil userInfo:nil];

});

【讨论】:

  • 当您发布通知时,您能否检查 ViewController B 是否在内存中?可以调试吗?
  • 为什么它不在内存中,它没有显示 AppDelegate * 0x7fe2caf1ba50 0x00007fe2caf1ba50 delayInSeconds double 2 popTime dispatch_time_t 19116090692644 _baseUrl NSString * nil 0x000000000000000
  • ViewController B 是根视图控制器吗?它应该是根视图控制器或加载到内存中以观察通知
  • appDel.window.rootViewController = 容器;
【解决方案3】:

如果现在已加载,您将无法在 SuggetionViewController 中收到通知。
您在 viewDidLoad 中添加观察者,这样您就可以在 SuggetionViewController 未加载时收到远程通知。

您应该确保在处理通知之前加载您的控制器。

【讨论】:

    【解决方案4】:

    当您发布通知时,您的“建议视图控制器”对象未初始化。所以没有 'SuggerionViewController' 对象来捕捉通知。

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    if(application.applicationState == UIApplicationStateBackground) {
    
        AppDelegate *appDel = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        SideMenuViewController *leftMenuViewController = [[SideMenuViewController alloc] init];
        SuggetionViewController *sug_controller = [[SuggetionViewController alloc] init]];
        [sug_controller registerNotification];
    
        [[NSNotificationCenter defaultCenter] postNotificationName: @"SuggetionPushNotification" object:nil userInfo:userInfo];
        MFSideMenuContainerViewController *container = [MFSideMenuContainerViewController containerWithCenterViewController:[[UINavigationController alloc] initWithRootViewController:sug_controller leftMenuViewController:leftMenuViewController rightMenuViewController:Nil];
        [self.window makeKeyAndVisible];
        appDel.window.rootViewController = container;
    }
    }
    

    将以下实例方法添加到SuggerionViewController

    - (void)registerNotification
     {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveTestNotification:) name:@"SuggetionPushNotification" object:nil];
     }
    
    - (void)receiveTestNotification
      {
            NSlog(@"Notification recieved-->>>");
      } 
    

    【讨论】:

    • 所以如果我做了 SuuggetionViewController *newObject=[SuggetionViewController new];
    • 如果我也在 appdelegate 中做了,它不会触发帖子
    • ViewDidload 方法不会在对象分配后立即被调用。请在延迟(1 或 2 秒)后使用计时器触发 appdelegate 的通知
    • @JoyalClifford 你可以试试上面的代码。在 receiveTestNotification 方法中添加任何代码之前,只需通过在方法中添加日志来检查代码是否正常工作。
    【解决方案5】:

    在你的 AppDelegate 实现中添加这个

    static void displayStatusChanged(CFNotificationCenterRef center, void *observer,
                                 CFStringRef name, const void *object,
                                 CFDictionaryRef userInfo) {
    if (name == CFSTR("com.apple.springboard.lockcomplete")) {
        [[NSUserDefaults standardUserDefaults] setBool:YES
                                                forKey:@"kDisplayStatusLocked"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    }
    

    在 applicationDidFinishLaunchingWithOptions 中,添加以下代码

    CFNotificationCenterAddObserver(
                                    CFNotificationCenterGetDarwinNotifyCenter(), NULL, displayStatusChanged,
                                    CFSTR("com.apple.springboard.lockcomplete"), NULL,
                                    CFNotificationSuspensionBehaviorDeliverImmediately);
    

    将其发布到您的 didRecieveRemoteNotification 方法中。

         [[NSNotificationCenter defaultCenter]postNotificationName:@"TestNotification" object:self];
    

    将此发布到您的视图控制器 viewDidLoad 方法中。

         [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(receiveTestNotification:)
                                                 name:@"TestNotification"
                                               object:nil];
    

    然后它会触发这个方法。

     - (void) receiveTestNotification:(NSNotification *) notification
       {
    
        if ([[notification name] isEqualToString:@"TestNotification"]) {
        NSLog (@"Successfully received the test notification!");
    
          }
       }
    

    【讨论】:

    • @JoyalClifford 请尝试上面的代码一次,已经编辑并检查它工作正常,希望它对你有帮助......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 2018-05-15
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2013-07-19
    相关资源
    最近更新 更多