2017-01-13 3 views
3

У меня есть несколько навигационных контроллеров. Они размещены как иерархии:Popping to root navigation controller - Swift 3

(A)SWRevealViewController 
     (B)Navigation Controller(sw_front) 
      (C)HomeViewController (root view controller) 
        (D)TabBarController --> 
          (E)Navigation Controller 1--> 
           (F)TableController 1 --> 
           (F)TableController 2. 
          (E)Navigation Controller 2--> 
           (F)TableController 1 --> 
           (F)TableController 2. 

Я хочу, чтобы совать к контроллеру вида корневой из основных навигационных контроллеров, то есть, я хочу, чтобы перейти от F к C или B. я говорил this ответ, и также преобразовали его в быстрое:

let appdel: AppDelegate = UIApplication.shared.delegate as! AppDelegate 
    let mainwindow : UIWindow = appdel.window! 
    let vcObj : HomeViewController = HomeViewController() 
    let navObj : UINavigationController = UINavigationController(rootViewController: vcObj) 
    mainwindow.rootViewController = navObj 

но он просто показывает пустой черный экран. Пожалуйста, помогите.

Я использую Xcode 8 и Swift 3.

+0

let drawerViewController = viewControllerFrom ("Main", vcid: "SliderMenuViewController") let dashboardVC = viewControllerFrom («Main», vcid: «UserDashboardViewController») как! UserDashboardViewController allow navigationControl = UINavigationController (rootViewController: dashboardVC) window? .rootViewController = navigationControl t –

+0

Как добавить TabBarController в HomeViewController? –

+0

@ ХиманшуМорадия это не работает. Нет ничего такого, как viewControllerFrom() – Dia

ответ

-2

Я использовал

let modal: UIViewController = self.storyboard?.instantiateViewController(withIdentifier: StoryBoardID) as UIViewController! 
self.present(modal, animated: true, completion: nil) 

сделать что-то вроде этого. StoryBoradID - это идентификатор, предоставленный ViewController. Может быть, это поможет в вашем случае.

+0

Выполнение этого приведет к тому, что все контроллеры VC в контроллере навигации будут сохранены в памяти и позволят пользователю повторно создать их поверх себя. Плохая практика. – bkwebhero

0

Вы можете отклонить конкретный контроллер просмотра, выполнив итерацию иерархии presentingViewController, а затем вызвав dismissViewController на тот, который вы хотите уволить.

Пример:

func dismissToHome() { 
    var vc = self.presentingViewController 

    while (vc != nil) { 
     if (vc!.isKind(of: HomeViewController.self)) { 
      break 
     } 

     vc = vc?.presentingViewController 
    } 

    vc?.dismiss(animated: true, completion: { 
     print("Dismissed to: ", vc!) 
    }) 
} 

выше будет вызывать dismissViewController на HomeViewController, который будет распустить контроллер представления, что оно представлено. Поскольку этот диспетчер уволен, все остальные дочерние контроллеры увольняются их родителями.

+0

даже это не работает – Dia

+0

@ пользователь7205816; Я тестировал это на той же иерархии, что и у вас. Я установил 'SWRevealViewController' через CocoaPods. Он отлично работал на XCode 8.2.1 iOS 8, 9, 10. – Brandon

+0

Я использовал SWRevealPushSegue от C до D, возможно, поэтому он не работает – Dia

2

Вместо того, подталкивая tabBarVC с помощью sw.pushFrontViewController(VC, animated: true) попробуйте использовать navigationController «сек нажимной метод,

self.navigationController?.pushViewController(tabBarVC!, animated: true) 

Тогда из TableController вызова следующий пойти в HomeViewController,

func goToHomeNavVC(){ 
     //parent is TabBar Controller 
     self.parent?.navigationController?.popToRootViewController(animated: true) 
    } 

Вот Demo

+0

Если я делаю .pushViewController, тогда есть место для панели навигации под фактической навигационной панелью – Dia

+0

Отправьте свой демонстрационный проект, если возможно –

+0

Это не возможно, поскольку проект почти завершен. Но мне нужно сделать SWRevealViewControllerPushSegue наверняка через код, поэтому я даже не могу использовать .pushViewController. Пожалуйста, помогите – Dia

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