2015-06-18 4 views
1

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

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
UIApplicationState state = [application applicationState]; 
if (state == UIApplicationStateActive) { 
    NSString *cancelTitle = @"Close"; 
    NSString *showTitle = @"Show"; 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"App" 
                 message:@"You got a new request." 
                 delegate:self 
               cancelButtonTitle:cancelTitle 
               otherButtonTitles:showTitle, nil]; 
    [alertView show]; 

} else { 
    //Do stuff that you would do if the application was not active 
} 
} 

Я хочу переместить нажатие кнопки show на другой контроллер.

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
if(buttonIndex == 0) 
{ 

} 
if(buttonIndex == 1) 
{ 
    [self showNewContact]; 
} 
} 

-(void)showNewContact 
{ 

Edit_app_viewController *detail=[[Edit_app_viewController alloc]init]; 

UIViewController *c = [self topViewController]; 
NSLog(@"View iS %@",c); 

[c.navigationController pushViewController:detail animated:YES]; 

} 

Получение ошибки: Нагрузочное приложения из-за неперехваченное исключение 'NSInvalidArgumentException', причина: '- [_ UIModalItemsPresentingViewController pushViewController: анимированный]: непризнанный селектор направлен например 0x169f5f10' *** Первого стека бросить вызов:

Обратите внимание.

Update:

- (UIViewController*)topViewController 
{ 
return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController]; 
} 
+0

Просьба указать, что находится в '[self showNewContact];' может быть проблема там. –

+1

вы уверены, что 'topViewController' имеет' navigationController' ?? –

+0

@MahmoudAdam Понятно, что контроллер верхнего уровня - UIModalItemsPresentingViewController not navigationController –

ответ

0

Я думаю, что с тех пор UIAlertView теперь UIAlertViewController так iOS8, может быть проблема в том, что вы должны ждать, пока тревога уволен и чем толкать новый контроллер, который можно сделать, как

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
if(buttonIndex == 0) 
{ 

} 
if(buttonIndex == 1) 
{ 
    [self performSelector:@selector(showNewContact) withObject:nil afterDelay:1.0]; 
} 
} 

В этом случае первое предупреждение будет отклонено, а новый VC будет нажат.

+0

Нет дающего сбоя снова –

+0

И он дает крах в ios7 и 8 как –

+0

Я думаю, что ответ @ artudev должен помочь вам, проблема должна быть теперь, когда вы не можете найти правильный VC –

0

Я думаю, что проблема в том, что вы толкаете ViewController, пока вы не имеете NavigationContoller

вы должны положить модальное мнение, что представлено в UINavigationController

обновление:

в проблема в том, что вы должны предоставить, чтобы rootViewController всегда был UINavigationController, так как вы можете получать push-уведомление в любое время при использовании приложения, поэтому я предлагаю заключить ваш rootViewController в UINavigationController

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:myViewController]; 
self.window.rootViewController = nav; 
+0

Просьба уточнить код –

+0

. Проблема заключается в том, что вам нужно предоставить, чтобы 'rootViewController' всегда был' UINavigationController', поскольку вы можете получать push-уведомление в любое время при использовании приложения, поэтому я предлагаю заключить ваш 'rootViewController' в 'UINavigationController', т.е.'UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController: myViewController]; self.window.rootViewController = nav; ' –

1

Используйте этот метод для расчета верхнего контроллера.

+ (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController 
{ 
    if ([rootViewController isKindOfClass:[UITabBarController class]]) { 
     UITabBarController* tabBarController = (UITabBarController*)rootViewController; 
     return [self topViewControllerWithRootViewController:tabBarController.selectedViewController]; 
    } else if ([rootViewController isKindOfClass:[UINavigationController class]]) { 
     UINavigationController* navigationController = (UINavigationController*)rootViewController; 
     return [self topViewControllerWithRootViewController:navigationController.visibleViewController]; 
    } else if (rootViewController.presentedViewController) { 
     UIViewController* presentedViewController = rootViewController.presentedViewController; 
     return [self topViewControllerWithRootViewController:presentedViewController]; 
    } else { 
     return rootViewController; 
    } 
} 
+0

какой вид передать в rootViewController? –

+0

'[UIApplication sharedApplication] .keyWindow.rootViewController' – arturdev

+0

Если бы этот метод уже был пробован ранее и теперь с вашим путем, он также переходит к этому виду, но сбрасывается там, когда нажимает обратно. он говорит [Edit_app_viewController performSelector: withObject: withObject:]: сообщение отправлено на освобожденный экземпляр 0x181dfa00 –

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