2016-06-06 3 views
1

У меня есть приложение со слайдером, где я предоставил возможность сбрасывать, чтобы переключаться между пользователями. Как только пользователь приложения переключится на другого пользователя, я хочу сбросить весь поток навигации и запустить его с 1-го экрана.Как сбросить диспетчер навигации ios swift

Для например

экрана A -> Экран B -> Экран C -> Экран D -> Пользователь открывает бегунок и переключения пользователей -> Перейти к Screen A (Удалить другой экран с навигацией). Мы можем рассмотреть пример приложения gmail здесь, где мы можем переключаться между разными учетными записями и перенаправлять пользователей gmail на первичные почтовые ящики.

EDIT:

Я использую библиотеку меню Slider доступны на мерзавца.

https://github.com/dekatotoro/SlideMenuControllerSwift

class AppDelegate: UIResponder, UIApplicationDelegate { 

     var window: UIWindow? 
     var navigationController: UINavigationController? 
     var storyboard: UIStoryboard? 
     var leftViewController: LeftSidePanelViewController? 
     // var uuid: String? 

     func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
      if Utility.getUserStatus() == 0 { 
       storyboard = UIStoryboard(name: "Main", bundle: nil) 
       let mainViewController = storyboard!.instantiateViewControllerWithIdentifier("LoginViewController") as! LoginViewController 

       leftViewController = storyboard!.instantiateViewControllerWithIdentifier("LeftSidePanelViewController") as? LeftSidePanelViewController 

       navigationController = UINavigationController(rootViewController: mainViewController) 
       UINavigationBar.appearance().tintColor = UIColor.whiteColor() 
       leftViewController!.mainViewController = navigationController 

let slideMenuController = ExSlideMenuController(mainViewController:navigationController!, leftMenuViewController: leftViewController!) 
       slideMenuController.automaticallyAdjustsScrollViewInsets = true 
       slideMenuController.delegate = mainViewController 

self.window?.backgroundColor = UIColor(red: 236.0, green: 238.0, blue: 241.0, alpha: 1.0) 
       self.window?.rootViewController = slideMenuController 
       self.window?.makeKeyAndVisible() 
       Utility.setUUID(UIDevice.currentDevice().identifierForVendor!.UUIDString) 
      } else { 
       storyboard = UIStoryboard(name: "Main", bundle: nil) 
       let mainViewController = storyboard!.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController 
       leftViewController = storyboard!.instantiateViewControllerWithIdentifier("LeftSidePanelViewController") as? LeftSidePanelViewController 
       navigationController = UINavigationController(rootViewController: mainViewController) 
       UINavigationBar.appearance().tintColor = UIColor.whiteColor() 
       leftViewController!.mainViewController = navigationController 

let slideMenuController = ExSlideMenuController(mainViewController:navigationController!, leftMenuViewController: leftViewController!) 
       slideMenuController.automaticallyAdjustsScrollViewInsets = true 
       slideMenuController.delegate = mainViewController 

self.window?.backgroundColor = UIColor(red: 236.0, green: 238.0, blue: 241.0, alpha: 1.0) 
       self.window?.rootViewController = slideMenuController 
       self.window?.makeKeyAndVisible() 
      } 
      return true 
     } 
    } 

Я пробовал различные решения для этого, но ничего, кажется, работает.

var alreadyPushed = false 
      //Check if the view was already pushed 
      if let viewControllers = self.navigationController?.viewControllers { 
       for viewController in viewControllers { 
        if let viewController = viewController as? HomeViewController { 
         self.navigationController?.popToViewController(viewController, animated: true); 
         print(" Push Your Controller") 
         alreadyPushed = true 
         break 
        } 
       } 
      } 

      if alreadyPushed == false { 
       print("Pushing...") 
       let YourControllerObject = self.storyboard?.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController 
       self.navigationController?.presentViewController(YourControllerObject, animated: true, completion: nil) 
// HERE also tried pushViewController but that was also not working.. 
       self.navigationController?.dismissViewControllerAnimated(false, completion: nil) 

      } 

Решение 2: -

попытался также self.navigationController .viewController.removeAll(), а затем нажмите/представить HomeView но тоже не работает?.

Любой, у кого есть какие-либо предложения или советы по его решению.

+0

Это должно сделать self.navigationController работу? .popToRootViewControllerAnimated (истинный) –

+0

@anishparajuli спасибо за совет, но это уже проходили, он не работает. – Scorpion

ответ

0

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

self.navigationController?.popToRootViewControllerAnimated(true) 

или сделать какой-то хак с навигацией стека

var viewCtonrollers = self.navigationController?.viewControllers 
let firstViewCtr = viewCtonrollers?.first; 
viewCtonrollers?.removeAll() 
viewCtonrollers?.insert(firstViewCtr!, atIndex: 0) 
self.navigationController?.viewControllers = viewCtonrollers! 
+0

Неудача, но оба не работают для меня. Не уверен в этой проблеме. – Scorpion

1

очень быстрый способ:

// Put this line in the UIViewController where you want to reset navigation 
self.navigationController?.viewControllers = [self] 

Вы сотрет стек вид контроллера и сбросьте навигацию.

0

Вместо того, чтобы возвращать навигацию, почему бы вам не установить rootViewController for Window еще раз, как показано ниже?

SharedAppDelegate.window?.rootViewController = MainStoryboard.instantiateViewControllerWithIdentifier("HomeNavigationController") 
+0

Я обновил код, поскольку я использую pod для слайдера. Я думаю, что он вызывает проблему при перенаправлении, потому что я создал демо с 4-мя экранами, а на последнем экране я поставил кнопку и нажал кнопку «Я просто написал 1 строку - navigationController .popTorootviewcontroller (true), и он работал отлично. Здесь я думаю, что я использовал pod, вызывающий некоторую проблему. Пожалуйста, проверьте класс deleagate и сообщите мне, можете ли вы указать что-то там. – Scorpion

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