2016-02-17 3 views
0

Я пытаюсь отобразить баннер с помощью Toast, если приложение получает уведомление, находясь на переднем плане.Ошибка приложения при отображении удаленного уведомления

Простой случай прекрасно работает без каких-либо проблем ..

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    UIView *parentView = [UIApplication sharedApplication].keyWindow.rootViewController.view; 
    [parentView makeToast:@"toast"]; 
} 

однако, когда я пытаюсь показать пользовательский вид моей, я получаю плохую EXC_BAD_ACCESS ошибку на showToast метода:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    UIView *bannerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.topController.view.frame.size.width, 80)]; 
    UIView *parentView = [UIApplication sharedApplication].keyWindow.rootViewController.view; 
    bannerView.backgroundColor = [UIColor redColor]; 
    [parentView showToast: bannerView duration:3.0 position:CSToastPositionTop completion:nil]; 
} 

Is - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo метод опасное место для программирования этого типа поведения? Имея сильную ссылку на parentView, похоже, не работает, как я могу определить, какой объект получает заново?

+1

Является ли «parentView» нием, когда вы вызываете «showToast» на нем? Кстати, почему вы пытаетесь получить «rootViewController»? Разве вы не должны видеть текущий видимый контроллер? – Alex

+0

Я не думаю, что родительский вид равен нулю, первый пример тоже потерпит неудачу, верно? Мой корневой вид является навигационным контроллером, поэтому я считаю его безопасным? –

+0

Работает ли 'makeToast' вместо' showToast', где вы получаете плохой доступ? – Alex

ответ

0

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

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


    if (application.applicationState == UIApplicationStateActive) 
    { 
     [self.window makeToast:@"This is a piece of toast."]; 
    } 
} 
+0

попробовал это также .. такая же ошибка .. –

+0

может окно в то время нуль .. вы можете проверить его точкой останова. – Max