2015-01-18 5 views
1

Когда я получить толчок уведомления IAM призывающего этот метод внутри AppDelegateUEAlertView делегат meethod не звонит?

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


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

Отсюда звонит метод, определенный в checkNotification:message() ViewController.m

-(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 делегат не называется ..

+0

В делетете приложения вы назначаете новый экземпляр контроллера представления. Вы, вероятно, захотите вызвать метод на экземпляре, который уже находится на экране – Paulw11

+0

, пожалуйста, сообщите мне ясно. Я ничего не понял – Naveen

+0

Я вижу предупреждение на экране моего приложения. Проблема только в том, когда я нажимаю кнопку «ok», что метод делегирования не является working – Naveen

ответ

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]; 
} 
+0

ok я запускаю этот код сейчас – Naveen

+0

cool его отлично работает благодаря многому – Naveen

-1

Проблема в том, что вы даете неправильный делегат. Ваш делегат - временный ViewController, упакованный в AppDelegate. Он будет уничтожен, как только метод activeNotification: (NSDictionary *) вернется. Но вы нажмете кнопку позже. Вы должны обеспечить срок жизни делегата.

Вы также можете использовать другого делегата, например, непосредственно AppDelegate или RootViewController.

Как Paulw11 указывалось, ниже не будет работать, потому что новый экземпляр возвращается из метода instantiateViewControllerWithIdentifier: (NSString *):

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

Это делает то же самое, что делает OP, просто используя раскадровку - вы все равно получаете новый экземпляр. Они могут использовать свойство 'rootViewController' своего appDelegate. – Paulw11

+0

Для того, чтобы ваш код работал, вам нужно будет каким-либо образом отобразить недавно созданный контроллер представлений (представить его модально или нажать на него в стек навигации. 't у него будет та же проблема, которую вы описываете (уходит, как только ваш код возвращается), как @PaulW упоминает. –

0

У вас есть несколько проблем. Как говорит @Robse, вы создаете новый экземпляр контроллера представлений в делетете приложения, который не подключается ни к чему и пытается вызвать метод в этом экземпляре. Это не имеет никакого смысла, и трудно сказать, как исправить это, не зная больше о своем приложении.

Вам нужно получить доступ к текущему контроллеру внешнего вида и отобразить предупреждение на этом контроллере. Чтобы помочь вам в этом, вам придется объяснить, как вы создаете и отображаете контроллеры представлений в своем приложении. Вы используете раскадровки? Можете ли вы быть уверены, какой контроллер просмотра отображается при получении push-уведомления?

Хорошо, исходя из ваших комментариев, я предполагаю, что ваш контроллер просмотра загружается главной раскадройкой вашего приложения и является начальным контроллером представления для вашего приложения. Это контроллер вида, который автоматически загружается при запуске.

Чтобы получить доступ к контроллеру вид корневой части главного окна приложения, используйте такой код:

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

Этот код спрашивает приложение для ключевого окна приложения, затем запросит ключевое окно для своего контроллера корневого представления, который в вашем случае должен быть вашим контроллером представления вашего приложения

Редактировать: Nevermind. Я вижу из ваших новых комментариев, что ваш контроллер представления по умолчанию НЕ является вашим контроллером, но у вас есть контроллер навигации. В этом случае вместо этого вы должны использовать код Paulw11.

Когда вы отправляете вопрос, пожалуйста, постарайтесь предоставить полное описание вашей проблемы.

Следующие был бы гораздо лучше, описание проблемы:

У меня есть приложение, которое использует раскадровку «Исходный контроллер представления является контроллером навигации, а затем контроллер представления корня. навигационный контроллер является экземпляр моего класса ViewController. Я пытаюсь отправить сообщение на мой ViewController, когда приложение делегат получает толчок уведомление.

с тха мы могли бы ответить на ваш вопрос одним выстрелом.

Обратите внимание, что часто, размышляя над тем, как описывать вашу проблему четко и достаточно полно, чтобы кто-то другой помог решить проблему, вы сможете самостоятельно найти свою проблему.

+0

да, используя раскадровку..am используя default ViewController .thats my Домашняя страница – Naveen

Смежные вопросы