2016-02-17 95 views
0

如果应用程序在前台收到通知,并试图显示使用Toast的横幅。在显示远程通知期间应用程序崩溃

简单的情况下工作正常,没有出现任何问题..

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

但是当我试图表明我自己的自定义视图,我上showToast方法不好EXC_BAD_ACCESS错误:

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

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo方法是编程这种类型的行为的危险地点?有一个强烈的参考parentView似乎并没有工作,我怎样才能确定哪个对象越来越过分?

+1

当你调用'showToast'时,是否有'parentView' nil?顺便说一句,你为什么试图获得'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

可能window当时是零..你可以通过断点检查它。 – Max

相关问题