UIAlertViewdelegate方法没有调用?

时间:2015-01-18 12:20:46

标签: ios objective-c delegates uialertview

当我收到推送通知iam在appDelegate中调用此方法时

-(void)activeNotification:(NSDictionary *)userInfo{
    NSLog(@"%@",userInfo);
    NSString *message = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];


    ViewController *view=[[ViewController alloc]init];
    [view checkNotification:message];
}

从这里开始调用ViewController.m中定义的方法checkNotification:message()

-(void)checkNotification:(NSString *)message{
        NSLog(@"%@",message);
        NSArray *arr=[[NSArray alloc]init];

    if([message hasPrefix:@"taxi"])
    {
        arr=[message componentsSeparatedByString:@":"];

        alertV=[[UIAlertView alloc]initWithTitle:@"Taxi" message:[arr objectAtIndex:1] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alertV show];

    }
 }

当我点击确定按钮时,我需要调用alertview委托方法

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
}

但这个方法没有被调用请帮帮我

在我的ViewController.h中

@interface ViewController : UIViewController<FBLoginViewDelegate,UIAlertViewDelegate>

我不知道为什么不调用AlertView委托..

3 个答案:

答案 0 :(得分:1)

您的代码正在分配ViewController的新实例,但您需要获取对视图层次结构中的实际视图控制器的引用。

你说你的ViewController在UINavigationController中,所以假设它是你显示的第一个视图控制器,它将位于导航堆栈的根目录下。您可以使用以下代码获取对它的引用 -

-(void)activeNotification:(NSDictionary *)userInfo{
    NSLog(@"%@",userInfo);
    NSString *message = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];

    UINavigationController *navC=(UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewController;

    ViewController *view=navC.viewControllers[0];
    [view checkNotification:message];
}

答案 1 :(得分:0)

你有多个问题。正如@Robse所说,您正在应用程序委托中创建一个新的视图控制器实例,该实例未连接到任何内容并尝试在该实例中调用方法。这没有任何意义,如果不了解您的应用程序,很难告诉您如何修复它。

您需要一种方法来访问当前的前视图控制器并在该视图控制器上显示警报。为了帮助您,您将不得不解释如何在应用程序中创建和显示视图控制器。你在使用故事板吗?您是否可以确定在收到推送通知时正在显示哪个视图控制器?

好的,根据您的评论,我猜您的应用程序的主故事板正在加载您的视图控制器,并且是您应用的初始视图控制器。这是在启动时自动加载的视图控制器。

要访问应用程序主窗口的根视图控制器,请使用以下代码:

[UIApplication sharedApplication].keyWindow.rootViewController

所以,你的代码看起来像这样:

-(void)activeNotification:(NSDictionary *)userInfo{
NSLog(@"%@",userInfo);
  NSString *message = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];

  ViewController *rootVC;
  rootVC = (ViewController *) [UIApplication sharedApplication].keyWindow.rootViewController;
  [rootVC checkNotification:message];
}

该代码询问应用程序的应用程序密钥窗口,然后询问其根视图控制器的关键窗口,在您的情况下应该是您的应用程序的起始视图控制器

编辑:没关系。我从你的新评论中看到你的默认视图控制器不是你的视图控制器,而是你有一个导航控制器。在这种情况下,您应该使用Paulw11的代码。

发布问题时,请尝试提供问题的完整说明。

以下内容可以更好地描述您的问题:

  

我有一个使用故事板的应用程序。“初始视图控制器是一个   导航控制器,然后是根视图控制器   导航控制器是我的ViewController类的一个实例。我   尝试在应用委托时向我的ViewController发送消息   收到推送通知。

有了这个,我们就可以一次性回答你的问题。

请注意,经常考虑如何清楚,完整地描述您的问题以便其他人帮助解决问题,这将触发您自己找到问题。

答案 2 :(得分:-1)

问题是,你给的是错误的代表。您的委托是AppDelegate中的临时ViewController。一旦方法activeNotification:(NSDictionary *)返回,它就会被销毁。但是您稍后会点击该按钮。您必须确保代表的生命周期。

你也可以使用另一个委托,比如直接使用AppDelegate或RootViewController。

正如Paulw11指出的那样,下面的代码不起作用,因为从方法instantiateViewControllerWithIdentifier返回一个新实例:(NSString *):

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                     bundle: nil];
MyViewController *controller = (MyViewController*)[mainStoryboard 
                instantiateViewControllerWithIdentifier: @"<Controller ID>"];