2016-11-28 7 views
1

Каков правильный путь для перехода к контроллеру представления из делегата приложения? Когда я получаю push-уведомление, я перехожу к контроллеру представления, но представления не завершены. Панель навигации выглядит неправильно. Вот мои настройки:После перехода к контроллеру вида из appdelegate

tabviewcontroller (storyboard name is 'main') 
- nav1controller -> view1controller -? view1detailcontroller (storyboard name is 'view1detail') 
- nav2controller -> ... 

При поступлении уведомления толчка, я хочу взять пользователь veiw1detailcontroller. Я хочу разрешить пользователю вернуться к view1controller.

Это код, у меня есть:

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let mainViewController = storyboard.instantiateViewControllerWithIdentifier("main") as! UIViewController 

let view1detailcontroller = storyboard.instantiateViewControllerWithIdentifier("view1detail") as! view1detailcontroller 

let nav = UINavigationController(rootViewController: mainViewController) 
nav.pushViewController(view1detailcontroller, animated: true) 
self.window!.rootViewController = nav 

Таким образом, переходы прекрасно view1detailcontroller. Однако, как только я вернусь к view1controller, панель навигации на этом экране и на всех других экранах говорит «main», и все навигационные элементы также отсутствуют.

Что я делаю неправильно?

+0

, что использование этого одного 'nav.pushViewController (view1detailcontroller, анимированный: истинный)' –

+0

мне нужно перейти к view1detailcontroller – Prabhu

ответ

1

Создавая новый навигационный контроллер, и установку self.window!.rootViewController = nav, вы в основном сбросить весь стек просмотра. (например, вы потеряете tabviewcontroller, упомянутый в вашей первой цитате иерархии представлений)

Вместо этого войдите в существующий контроллер представления таблиц и его дочерний навигационный контроллер, чтобы нажать новый контроллер вида. Если вам нужна дополнительная помощь в том, как это можно сделать, вам нужно поделиться еще одним снижением экрана кода/раскадровки, чтобы понять вашу существующую настройку.

EDIT

Из ваших комментариев, кажется (хотя и не очень ясно), что ваш self.wondow.rootViewController уже ваш «tabBarController», который содержит навигационные контроллеры. Предполагая, что это, и что вы знаете индекс вашей целевой контроллер навигации в пределах tabbarcontroller, вы можете сделать следующее, чтобы открыть предназначенный контроллер представления с иерархией

  1. При получении получить доступ к Push уведомления о tabBaController:

    если let tabBarController = self.window.rootViewController как? UITabBarController

  2. доступа к контроллеру навигации внутри контроллера панели вкладок: (код предполагает предназначенный нав контроллером является первой вкладкой Изменения индекса в коде в соответствии с вашими настройками.)

    если пусть NavController = tabBarController.viewControllers [0] в виде?UITabBarController

  3. Создать массив всех контроллеров вы хотите просмотреть на этом навигационный контроллер и установить их с помощью setViewControllers метод:

    вар viewControllersArray: [UIViewController] = UIViewController; viewControllersArray.append (view1controller) viewControllersArray.append (view1detailcontroller) navController.setViewControllers (viewControllers: viewControllersArray, анимированные: правда)

  4. Здесь экземпляр view1controller и view1detailcontroller как вы делаете в кодовой форме раскадровки и обратите внимание на следующее форма setViewControllers documentation

последний элемент, добавленный в массив становится верхний элемент стека навигации

+0

Спасибо. Как получить доступ к контроллеру навигации контроллера табуляции? У меня есть свой контроллер табуляции: var mainViewController = storyboard.instantiateViewControllerWithIdentifier («main») как UIViewController self.window? .rootViewController = mainViewController – Prabhu

+0

Подождите! В этом вопросе ваш код упоминает 'main' как идентификатор раскадровки, который вы просматриваете в контроллере, который вы пытаетесь нажать, и в этом комментарии вы говорите его идентификатор вашего контроллера tabviewcontroller. Который из них? – lukya

+0

имя вкладки viewcontoller в моей раскадровке является «основным». Он имеет контроллер навигации, который имеет два контроллера вида (view1controller и view1detailcontroller). В принципе, я хочу, чтобы пользователь перешел в view1detailcontroller, сохраняя кнопку «Назад» и вкладки. – Prabhu

0

Вместо того, чтобы нажимать контроллер просмотра прямо из главной раскадровки, вы должны получить topViewController или visibleController и нажать на требуемый viewController на topController, чтобы он поддерживал ваши стеки ViewController, и вы получите то, что хотите.

+0

Не могли бы вы помочь мне с каким-то кодом? Я новичок в быстроте. Благодаря! – Prabhu

+0

Я могу написать algo, как вы должны делать – devjangir

+0

Я могу написать algo, как вы должны это сделать, например, сначала получить rootviewcontroller для Windows, это должен быть ваш navigationController, а затем получить topController в UINavigationController, если это detailViewController, затем использовать это и нажимать ваши данные , в противном случае пройдите все контроллеры контроллера стека UINavigationController и получите объект detailController и используйте этот VC для продвижения вашего кода. – devjangir

0

Вы можете использовать это:

var rootViewController = self.window!.rootViewController as UINavigationController 
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    var viewController = mainStoryboard.instantiateViewControllerWithIdentifier("view") as ViewController 
    rootViewController.pushToViewController(viewController, animated: true) 
+0

Проблема заключается в том, что он не сохраняет мои представления вкладок и стек навигации. – Prabhu

+0

Вы можете установить в следующем контроллере представления: переопределение FUNC viewWillAppear (анимированный: Bool) { super.viewWillAppear (анимированный) self.navigationController .setNavigationBarHidden? (Правда, анимированные: анимированные) } – User511

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