Переключитесь с UIViewController на другой ViewController, который находится внутри navigationController.

У меня есть следующие взгляды:

TabBarController включает (MapViewController, NavigationController) Контроллер навигации включает DetailViewController, на который необходимо переключиться. Код ниже используется в файле MapViewController.

Прямо сейчас мой код:

    let eventDetailViewController : EventDetailViewController = self.storyboard?.instantiateViewControllerWithIdentifier("EventDetail") as EventDetailViewController
    eventDetailViewController.event = event
    self.showViewController(eventDetailViewController, sender: self)

Это работает, но в навигационном контроллере нет никакой информации (например, я не могу перейти к firstviewcontroller).

Как запустить этот код через навигационный контроллер?

Ниже приведен скриншот раскадровки. Слева направо: TabbarController -> NavigationController и MapController. Контроллер навигации -> Контроллер событий. Самый правильный вид — EventDetailView Storyboard


person KnijnOps    schedule 06.11.2014    source источник
comment
Является ли EventDetailViewController корневым контроллером представления контроллера навигации?   -  person rdelmar    schedule 07.11.2014
comment
Можете ли вы уточнить 1) что такое rootViewController контроллера навигации? 2) где появляется «firstViewController»? 3) где именно/как вы хотите показать eventDetailViewController? Вы хотите, чтобы он «нажал» на навигационный контроллер, который находится на отдельной вкладке tabBarController? Или отображается (в навигационном контроллере) модально поверх MapView?   -  person pbasdf    schedule 07.11.2014
comment
Объяснение этого вопроса кружит мне голову. Начиная с Navigationcontroller: rootViewController NavigationController называется EventController. Контроллер событий имеет табличное представление, из которого он показывает контроллер подробностей при нажатии на ячейку. Я хочу, чтобы представление было перенесено на навигационный контроллер. Извините за путаницу, я сам довольно запутался.   -  person KnijnOps    schedule 07.11.2014
comment
Попробуйте следующее в своей функции didSelectRowAtIndexPath: self.navigationController.pushViewController(eventDetailViewController, animated: YES) (с теми же двумя первыми строками, которые вы использовали выше)   -  person pbasdf    schedule 07.11.2014
comment
Мне нужно выполнить это нажатие из MapController, который включен в контроллер панели вкладок. Я думаю, что это то, что является реальной проблемой. Это уже работает в функции didselectrow... . Извините за путаницу еще раз!   -  person KnijnOps    schedule 07.11.2014
comment
Пожалуйста, сделайте снимок экрана с раскадровкой и добавьте его к вопросу.   -  person Daniel T.    schedule 07.11.2014
comment
Сделано это. Надеюсь, теперь стало понятнее.   -  person KnijnOps    schedule 07.11.2014
comment
Может кто-нибудь проверить скриншот? Спасибо   -  person KnijnOps    schedule 07.11.2014


Ответы (1)


Итак, из вашего MapView self.tabBarController будет указывать на tabBarController. Судя по вашей раскадровке, контроллер навигации является первой вкладкой, поэтому он будет иметь индекс 0 в свойстве viewControllers tabBarController. Таким образом, вы должны быть в состоянии сделать следующее:

let eventDetailViewController : EventDetailViewController = self.storyboard?.instantiateViewControllerWithIdentifier("EventDetail") as EventDetailViewController
eventDetailViewController.event = event
let navController : UINavigationController = self.tabBarController.viewControllers[0] as UINavigationController
navController.pushViewController(eventDetailViewController, animated:YES)
self.tabBarController.selectedIndex = 0

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

person pbasdf    schedule 07.11.2014
comment
Спасибо за ваш ответ. Это решило мою проблему. Иногда мне нужно было добавить ? но кроме того; это работает! - person KnijnOps; 07.11.2014