2016-01-30 3 views
0

У меня есть функция, которая прослушивает изменение местоположения пользователя и основывается на некоторых условиях, которые я хочу откройте контроллер просмотра на раскадровке. Этот контроллер просмотра обычно открывается из таблицы viewconroller при нажатии на ячейку. я хочу перейти к этому контроллеру представления из appdelegate. Я пробовал много комбинаций кода из похожих сообщений на этом веб-сайте, но ни один из них не загрузил страницу должным образом, поэтому я могу использовать навигацию после этого. Это ближайший я получил:Представляя ViewController из AppDelegate, он появляется, но navbar неактивен, и я не могу перейти на какой-либо другой вид оттуда

if(site != nil){ 

     if (currentExhibitionSiteId != site?.ID) { 

      currentExhibitionSiteId = (site?.ID)! 


      let storyboard = UIStoryboard(name: "Main", bundle: nil) 

      let detailViewController = storyboard.instantiateViewControllerWithIdentifier("DetailViewController") as!DetailViewController 
      detailViewController.site = site 

      let locTable = storyboard.instantiateViewControllerWithIdentifier("sitesTable") as! LocationsTableViewController 



      let frontNav = UINavigationController.init(rootViewController: detailViewController) 

      let rearNav = UINavigationController.init(rootViewController: locTable) 

      let mainRoot = SWRevealViewController.init(rearViewController: rearNav, frontViewController: frontNav) 

      self.window?.rootViewController = mainRoot 
      self.window?.makeKeyAndVisible() 


     } 
    } 

this is the how it stays in the storyboard

+0

Этот код выглядит как замена текущего контроллера корневого представления. Это не будет переход от старого к новому, который просто заменит его. Можете ли вы уточнить, что вы хотите увидеть при переходе? Может быть, вам нужен модальный корень? Или толчок от корня? Или что-то обычай? – bolnad

+0

Я не хотел заменять текущий контроллер корневого представления, я просто новый в этом приключении для создания приложений для iOS. В чем моя цель: у меня есть куча сайтов и их координаты. Я проверяю местоположение пользователя, и если пользователь находится близко к любому из местоположений, я хочу, чтобы приложение перешло к этому подробному представлению, чтобы они могли видеть информацию об этом сайте. Мне нужно, чтобы это произошло только в приложении из любого представления. – stan

+0

Также я использую ** SWRevealViewController ** для моего меню. – stan

ответ

0

Не нужно перезаписывать существующий rootViewController. Вы можете попробовать немного переструктурировать свою структуру и сделать исходный rootViewController UINavigationController. Затем вы можете просто добавить detailViewController к нему через шоу-вызов.

В вашем AppDelegate на начальной установке может выглядеть примерно так ....

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    if let window = self.window { 

     if let window = self.window { 

     window.makeKeyAndVisible() 
     navController = window.rootViewController as? UINavigationController 
    } 
    return true 
} 

Вы также хранить ссылку на ваш основной UINavigationController в качестве свойства. var navController: UINavigationController? Или вы можете бросать его каждый раз с window.rootViewController.

Ваша основная раскадровка будет состоять из UINavigationController, с подключенным UITableViewController, а затем вашим DetailViewController, который вы хотите показать, когда кто-то нажимает на ячейку. Для этого я сделал базовую раскадровку, и это будет выглядеть так. StoryboardImage

Имейте в виду, что вам нужно будет выбрать isInitialViewController в инспекторе свойств UINavigationController, чтобы сделать эту работу. InitialViewControllerCheckbox

Если вы хотите, чтобы вызвать представление, чтобы перемещаться поверх существующей точки зрения, то есть в вашем метод onLocationChanged, вы можете ссылаться, что NavController свойство, чтобы добавить вид

func onLocationChanged(location: CLLocationCoordinate2D) { 

    let site: ExhibitionSite? = self.exhibitionSiteRepository.findClosestSite(location) 


    if(site != nil){ 

     if (currentExhibitionSiteId != site?.ID) { 
      currentExhibitionSiteId = (site?.ID)! 
      let storyboard = UIStoryboard(name: "Main", bundle: nil) 
      let detailViewController = storyboard.instantiateViewControllerWithIdentifier("DetailViewController") as? DetailViewController 
      detailViewController!.site = site 

      navController?.showViewController(detailViewController, sender: self) 
     } 

} 

Здесь загружаемые основной раскадровки и запросить DetailViewController своим идентификатором. Убедитесь, что в DetailViewController есть заполненный идентификатор, чтобы вы могли получить к нему доступ, иначе он сработает.

Если вы не хотите, чтобы он нажимал на экран, как анимацию navigationController, вы можете изменить этот вызов на .presentViewController(detailViewController, animated: false, completion:nil), а затем он поместит полный модальный вид на ваш существующий вид.

Надеюсь, что это поможет, и я не уверен, как вы использовали этот SWRevealMenuController относительно того, как он влияет на вашу раскадровку.Из того, что я знаю о SWRevealMenuController, он берет немного вашей иерархии, поэтому, возможно, имеет смысл перемещать все изменения местоположения в контроллер верхнего уровня под UINavigationController. Не похоже, что есть какая-то причина, по которой locationChanged вещи NEEDs должны быть в AppDelegate. Если у вас возникнут проблемы, я могу присмотреться.

+0

привет, пожалуйста, я был в отъезде на некоторое время. Я все еще борюсь с этой проблемой. Я изменил код так, как указано выше в отредактированном вопросе. У меня есть SWRevealViewController как мой корень, и изменения в других представлениях могут повредить структуру приложения, поэтому я скорее попытаюсь исправить его так, как есть. Когда этот код изменен, мой подробный просмотр загружается, но навигация вверху все еще не работает. Я включил скриншот раскадровки. Большое спасибо. – stan

+0

@stan, может быть, проще поделиться своим кодом? Хотел бы ты чувствовать себя комфортно, помещая его где-нибудь, чтобы я мог реализовать вас? – bolnad

+0

Что именно вам нужно и где я могу отправить его вам? Короче говоря, у меня есть местоположения на карте с аннотациями! Когда вы нажимаете на местоположение, это открывает представление сведений о местоположении! У меня также есть таблица со всеми местоположениями, из которых вы также можете перейти на страницу сведений! Меню для приложения и навигации обрабатывается SWRevealViewController, и каждый раздел из меню имеет свой собственный контроллер навигации! Смотрите изображение, которое я поставил выше! Моя цель - открыть страницу сведений, когда пользователь близок к местоположению! Я обрабатываю это в appdelegate – stan

0

Вместо этого подхода я сделал бы вручную SEGUE и позвонить ViewController.performSegueWithIdentifier (...). Это позволит вам сделать шоу segue и сохранить навигационную панель на объекте UINavigationController.

+0

выполнить segue не вызывается из appdelegate – stan

0

Код вставки DetailViewController в UINavigationController. Настройте свой NavigationBar от Story Board. Дайте StoryboardID этому навигационному контроллеру. Пусть это будет MyNavVC. Затем измените свой код на

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let navController = storyboard.instantiateViewControllerWithIdentifier("MyNavVC") as? UINavigationController 

    (navController.rootViewController as! DetailViewController)!.site = site 
    self.window!.rootViewController = navController 
    self.window!.makeKeyAndVisible() 
+0

это выглядит хорошо, но строка: ** (navController.rootViewController as! DetailViewController) !. site = site ** не принимается, он дает ошибку - значение «UINavigationController?» не имеет члена 'rootViewController' – stan

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