[英]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.