【问题标题】:How to reset navigationviewcontroller ios swift如何重置navigationviewcontroller ios swift
【发布时间】:2016-06-06 10:53:31
【问题描述】:

我有一个带有 Slider 的应用程序,我提供了下拉菜单以在用户之间切换。一旦应用用户切换到其他用户,我想重置整个导航流程并从第一个屏幕开始。

例如

屏幕 A -> 屏幕 B -> 屏幕 C -> 屏幕 D -> 用户打开滑块并切换用户 -> 跳转到屏幕 A(从导航中删除其他屏幕)。我们可以在这里考虑 gmail 应用示例,在这里我们可以在不同帐户之间切换,并且 gmail 应用将用户重定向到主收件箱。

编辑:

我正在使用 git 上提供的 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,但这也不起作用。

任何人有任何解决此问题的建议或提示。

【问题讨论】:

  • 这应该做的工作 self.navigationController?.popToRootViewControllerAnimated(true)
  • @anishparajuli 感谢您的提示,但已经尝试过了,但它不起作用。

标签: ios uiviewcontroller uinavigationcontroller swift2


【解决方案1】:

一个非常快速的方法:

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

您将擦除视图控制器堆栈并重置导航。

【讨论】:

    【解决方案2】:

    你可以用它

    self.navigationController?.popToRootViewControllerAnimated(true)
    

    或者用导航栈做一些修改

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

    【讨论】:

    • 运气不好,但两者都不适合我。不确定这个问题。
    【解决方案3】:

    您可以像下面这样再次为 Window 设置 rootViewController,而不是恢复导航?

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

    【讨论】:

    • 我已经更新了代码,因为我正在使用滑块作为滑块,我认为它会导致重定向问题,因为我已经创建了 4 个屏幕的演示,并且在最后一个屏幕上我已经放置了一个按钮并单击按钮我刚刚写了 1 行 - navigationController.popTorootviewcontroller(true),它工作得非常好。在这里,我认为由于我使用了 pod,它会导致一些问题。请检查代表类,如果你能指出什么,请告诉我。
    【解决方案4】:

    对于 Swift 3,使用以下代码:

    self?.navigationController?.popToRootViewController(animated: true)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      相关资源
      最近更新 更多