2

В Appdelegate.m добавлен метод postNotificationpostNotificationName еще не вызвать в AppDelegate класса

- (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) В viewDidLoad

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



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

} 

Но здесь еще не огонь уведомления, если добавляется как пост и addobserver в том же классе, что и только огонь. что я сделал неправильно. Я ссылаюсь на Send and receive messages through NSNotificationCenter in Objective-C?. Пожалуйста, помогите

+0

Обратится по ссылке http://stackoverflow.com/questions/4577255/nsnotification-postnotificationname-in-appdelegate-but-nsnotificationcenter-in-v может помочь вам –

+0

@ShangariC я видел это также. но до сих пор еще нет –

ответ

0

Вы вызываете свое уведомление из метода запуска в делегате приложения, прежде чем любая иерархия view/viewcontroller изменится для создания и загрузки. Причина, по которой вы не получаете уведомление, заключается в том, что пока еще не был создан экземпляр SuggestetionViewController. Если вы хотите, чтобы уведомление было получено, вам необходимо запустить его после того, как контроллер просмотра получит изменение, которое будет создано.

+0

после загрузки SuggestetionViewController также он еще не добавил, что наблюдатель не срабатывает. –

+0

Что можно сделать? Пожалуйста, предложите –

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]; 

}); 
+0

. Я попробовал с большей задержкой и еще не работает. –

+0

. Вы можете проверить, что ViewController B находится в памяти, когда вы отправляете уведомление? Можете ли вы его отладить? –

+0

почему его нет в памяти, его не показывая AppDelegate * \t \t 0x7fe2caf1ba50 0x00007fe2caf1ba50 delayInSeconds \t \t 2 двойные popTime \t \t dispatch_time_t 19116090692644 _baseUrl \t NSString * \t \t ноль 0x0000000000000000 –

0

Вы не можете получить уведомление внутри вашего SuggetionViewController, если он сейчас загружен.
Вы добавляете наблюдателя в viewDidLoad, поэтому может случиться так, что вы получите удаленное уведомление, а SuggetionViewController не загружено.

Перед обработкой уведомлений вы должны убедиться, что ваш контроллер загружен.

0

Ваш объект "SuggestetionViewController" не инициализируется при отправке уведомления. Таким образом, объект «SuggestetionViewController» отсутствует, чтобы поймать уведомление.

- (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; 
} 
} 

Добавьте следующий метод экземпляра для SuggetionViewController

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

- (void)receiveTestNotification 
    { 
     NSlog(@"Notification recieved-->>>"); 
    } 
+0

Итак, если я сделал SuggestetionViewController * newObject = [SuggestetionViewController new]; –

+0

, если я тоже в appdelegate не будет запускать сообщение –

+0

Метод ViewDidload не будет вызван сразу после выделения объекта. Пожалуйста, отпустите уведомление от appdelegate, используя таймер после задержки (1 или 2 секунды). – jjpp

0

В вашей реализации 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!"); 

     } 
    } 
+0

Я пробовал этот, но не работал. –

+0

Можете ли вы проверить один раз по точкам останова, где именно это отсутствует ... – Santo

+0

@JoyalClifford, пожалуйста, попробуйте вышеуказанный код один раз, отредактируйте и проверите, он работает нормально, надеюсь, что это поможет вам ... – Santo