UIAlertView 委托方法没有调用?

Posted

技术标签:

【中文标题】UIAlertView 委托方法没有调用?【英文标题】:UIAlertView delegate meethod is not calling? 【发布时间】:2015-01-18 12:20:45 【问题描述】:

当我收到推送通知时,我会在 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 委托..

【问题讨论】:

在您的应用委托中,您正在分配一个新的视图控制器实例。您可能希望在屏幕上已经存在的实例上调用该方法 请告诉我清楚..我什么都不懂 我可以在我的应用程序屏幕上看到 alertview 唯一的问题是当我单击“确定”按钮时,委托方法不起作用 当你说 ` ViewController *view=[[ViewController alloc]init];` 你正在创建一个新的 ViewController 实例 - 这不是管理你的显示的实例 那么我该如何调用我的方法呢? 【参考方案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];

【讨论】:

【参考方案2】:

您有多个问题。正如@Robse 所说,您正在应用程序委托中创建一个新的视图控制器实例,该实例未连接到任何东西并尝试在该实例中调用方法。这没有任何意义,而且在不了解您的应用的更多信息的情况下很难告诉您如何解决它。

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

好的,根据您的 cmets,我猜您的视图控制器正在由您的应用程序的主情节提要加载,并且是您的应用程序的初始视图控制器。这是在启动时自动加载的视图控制器。

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

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

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

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

当您发布问题时,请尝试提供您问题的完整描述。

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

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

这样我们就可以一口气回答您的问题。

请注意,通常,仔细考虑如何清楚完整地描述您的问题,以便其他人帮助解决它会促使您自己发现问题。

【讨论】:

是的,我正在使用 storyboard..am 正在使用默认的 ViewController。这就是我的主页【参考方案3】:

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

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

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

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

【讨论】:

这和 OP 做的事情一样,只是使用了一个故事板——你仍然会得到一个新的实例。他们也许可以使用他们的 appDelegate 的 rootViewController 属性 为了让您的代码工作,您必须以某种方式显示新实例化的视图控制器(以模态方式呈现它,或将其推送到导航堆栈上。如果您不这样做,它将具有相同的正如@PaulW 提到的那样,您描述的问题(代码返回后立即消失)。

以上是关于UIAlertView 委托方法没有调用?的主要内容,如果未能解决你的问题,请参考以下文章

在 UI 自动化测试中解除警报时未调用 UIAlertView 的委托方法“clickedButtonAtIndex”

没有调用 URLConnection 委托方法

有没有简单的方法来处理 UIAlertView 结果而无需委托?

对象在 UIAlertView 委托被调用之前被释放

在委托中显示 UIAlertView 失败

未调用委托方法“clickedButtonAtIndex:”