2016-01-08 2 views
1

Я хочу открыть определенный контроллер представления (скрытый, поскольку он доступен только при получении определенного push-уведомления (он недоступен через панель вкладок)), и я был способен сделать это, но у меня возникла проблема.Загрузите определенный viewController на push-уведомление Swift 2 AppDelegate

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

Уведомление инициирует передачу определенного контроллера вида спереди, но проблема в том, что я больше не имею доступа к панели вкладок.

Я не знаю, как этого достичь.

Это мой код в AppDelegate.m:

var presentedVC = self.window?.rootViewController as? UINavigationController 
while (presentedVC!.navigationController != nil) { 
    presentedVC = presentedVC!.navigationController 
} 
let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let destinationViewController = storyboard.instantiateViewControllerWithIdentifier("PushNotificationView") as? NotTestViewController 

destinationViewController?.url = self.url! 
presentedVC?.presentViewController(destinationViewController!, animated: true, completion: nil) 

}) 
) 
alertCtrl.addAction(UIAlertAction(title: "Cancelar", style: .Destructive, handler: nil)) 

Этот код работает, но не с желаемым поведением.

Любые идеи, что мне не хватает?

Спасибо большое

EDIT

Я изменил RAMTabBarAnimationController к TabBarControllerRAMTabBarAnimationController, потому что не наследует от TabBarController. Но я все еще вижу такое же поведение.

+0

Как насчет 'presentedVC .tabBarController ? .selectedViewController? .pushViewController (destinationViewController !, animated: true) '? – Adam

+0

use window.rootViewController presentViewController ..... пожалуйста, имейте в виду. Приложения, которые требуют Push-уведомлений для работы, будут отклонены. –

+1

Возможный дубликат [Представление определенного контроллера вида из AppDelegate] (http: // stackoverflow. com/questions/9548911/presenting-a-specific-view-controller-from-appdelegate) –

ответ

4

Я хочу ответить на мой собственный вопрос, потому что я думаю, что, возможно, кто-то сталкивается с такой же ситуацией, я должен сказать спасибо @Muneeba

Ну, в первую очередь, вам нужно знать, нужно ли ваше дистанционное push-уведомление фоновая выборка, это важно, потому что если так, didReceiveRemoteNotification вызывается дважды (сначала при нажатии на уведомление, секундах, когда он открывает приложение), поэтому вы должны знать об этом.

В моем случае я не делал фоновой выборки, поэтому мой флаг content-available:false был установлен в false.

Следующее, что нужно сделать, это добавить вам желание ["key":value] к полезной нагрузке, чтобы узнать, хотите ли вы открыть определенный контроллер представления или нет.

Управление открытием контроллера вида или нет.

В моем приложении я хочу открыть всплывающее предупреждение, всегда отображающее тело push-уведомления (с кнопкой OK), и только когда задано определенное значение, откройте контрольный элемент с вопросом к пользователю, или он не хочет, чтобы открыть новый контент, который поступает (обычно это содержание является на основе веб-контента, что открыть WebView, встроенный в контроллер представления)

в didReceiveRemoteNotification:

if let mensaje = userInfo["m"] as? String { 
// Here is where I know if the value is set in the notification payload 
let alertCtrl = UIAlertController(title: titulo, message: mensaje as String, preferredStyle: UIAlertControllerStyle.Alert) 
if url == nil { 
    alertCtrl.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil)) 
} else { 
alertCtrl.addAction(UIAlertAction(title: "Ver receta", style: .Default, handler: { 
    action in 

     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     //self.window?.rootViewController = storyboard.instantiateViewControllerWithIdentifier("TabbedController") as! UITabBarController 
     let navigationController = storyboard.instantiateViewControllerWithIdentifier("pushNotificationNavigation") as! UINavigationController 
     let dVC:NotTestViewController = navigationController.topViewController as! NotTestViewController 
     // This is for passing the URL to the view Controller 
     dVC.url = self.url! 
     self.window?.rootViewController?.presentViewController(navigationController, animated: true, completion: {}) 

     }) 
    ) 
     alertCtrl.addAction(UIAlertAction(title: "Cancelar", style: .Destructive, handler: nil)) 
    } 
    // Find the presented VC... 
    var presentedVC = self.window?.rootViewController 
    while (presentedVC!.presentedViewController != nil) { 
     presentedVC = presentedVC!.presentedViewController 
     } 
     presentedVC!.presentViewController(alertCtrl, animated: true, completion: nil) 

     handler(UIBackgroundFetchResult.NoData) 
} 
+0

данная ошибка как: Использование неразрешенного идентификатора 'url' – Nilesh

+0

Привет @Nilesh url, который вы видите, является переменной NotTestViewController, которую я использую. В NotTestViewController у меня есть webView и он содержит переменную url: String. Когда я вызываю этот контроллер из AppDelegate, я передаю этот URL-адрес, который пришел с уведомлением в полезной нагрузке. – neteot

0

Ваш RAMAnimatedTabBarController наследует какой класс? если он наследует UIViewController/UITabbarController затем взять UINavigationController и установить его rootViewController в свой RAMAnimatedTabBarController экземпляр, а затем назначить его в качестве RootViewController окна и установить navigationBar скрытые для этого UINavigationController и когда вы хотите, чтобы подтолкнуть к конкретному контроллеру делать как этот

var presentedVC = self.window?.rootViewController as? UINavigationController 
presentedVC(yourdesiredController, animated: true) 
+0

Я изменил RAMAnimatedTabBarController на UITarbBarController из-за того, что вы сказали (RAMAnimatedTabBar не наследует от UITabBarController) после этого изменения, я не могу показать вкладку над новым представлением .. также «Невозможно вызвать значение не-функции тип «UINavigationController?» при попытке «ПредставленныйVC (destinationViewController !, анимированный: true)» – neteot

+0

Вы хотите показать вкладки на своем конкретном представлении? скажите мне ваши полные требования. Также обновите вопрос с помощью нового кода. – Muneeba

+0

Привет @Muneeba это WebView, который я хочу показать, когда уведомление приходит с определенной полезной нагрузкой, я хочу показать вкладку, потому что если вы не можете избавиться от веб-просмотра, вы также не сможете перемещаться по этому приложению. Этот веб-просмотр отображается только в appdelegate in didReceiveRemoteNotification. – neteot

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