繁体   English   中英

UIAlertView委托meethod不打电话吗?

[英]UIAlertView delegate meethod is not calling?

当我收到推送通知时,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委托不被称为..

您的代码正在分配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];
}

您有多个问题。 正如@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代表收到推送通知。

这样一来,我们将能够一口气回答您的问题。

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

问题是,您给了错误的委托。 您的委托是在AppDelegate中创建的临时ViewController。 方法activeNotification:(NSDictionary *)返回时,它将立即销毁。 但是您稍后会单击该按钮。 您必须确保代表的生命周期。

您还可以使用其他委托,例如直接使用AppDelegate或RootViewController。

正如Paulw11所指出的,以下内容将不起作用,因为方法instantiateViewControllerWithIdentifier:(NSString *)返回了一个新实例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM