退出时保存VC(IOS)

时间:2017-09-17 08:15:24

标签: ios swift xcode

我在退出上有保存VC 的代码。

它可以工作,但我使用 SWRevealViewController ,但不显示应用程序中的导航控制器

我该如何纠正?

ViewController.swift

super.viewDidLoad()
NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "View")

ViewController2.swift

super.viewDidLoad()
NSUserDefaults.standardUserDefaults().setInteger(1, forKey: "View")

AppDelegate.swift

let viewCount = UserDefaults.standard.integer(forKey: "View")
var VC = UIViewController()
let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
print(viewCount)
if viewCount == 0 {
    VC = storyboard.instantiateViewController(withIdentifier: "First") as! ViewController
} else if viewCount == 1 {
    VC = storyboard.instantiateViewController(withIdentifier: "Second") as! ViewController2
}

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

return true

Error

My StoryBoard

2 个答案:

答案 0 :(得分:0)

如果您的故事板中您的初始ViewController是UINavigationViewController,那么您可以在AppDelegate didFinishLaunchingWithOptions中访问此导航控制器,如下所示:

let navigationController = application.windows[0].rootViewController as! UINavigationController

此外,无需在UserDefaults中跟踪/保存视图控制器,您可以随时访问ViewControllers列表

<强>的AppDelegate

let childViewControllers = window?.rootViewController?.childViewControllers
print("childVC: \(String(describing: childViewControllers))")

在任何其他 ViewController

let childViewControllers = UIApplication.shared.keyWindow?.rootViewController?.childViewControllers
print("vcs : \(String(describing: childViewControllers))")

当然,您可以比较childViewControllers列表

if let childViewControllers = UIApplication.shared.keyWindow?.rootViewController?.childViewControllers {
    for viewController in childViewControllers {
        if viewController is FirstViewController {
            print("firstViewController found...")
        }
        if viewController is SecondViewController {
            print("secondViewController found...")
        }
    }
}

如果你使用storyboard为侧面菜单设置SWRevealViewController,那么基本设置应该像 enter image description here

有关 SWRevealViewController 的详细信息,请查看他们的GitHub documentation,查看示例项目并在此处提及教程以便深入了解。希望它有所帮助。

答案 1 :(得分:0)

所以我认为问题在于您将窗口的根视图控制器设置为常规视图控制器。您需要做的是将其设置为带有嵌入式视图控制器的导航控制器。我不确定您使用SWRevealViewController的确切设置,但我想您需要这样的内容:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    let viewCount = UserDefaults.standard.integer(forKey: "View")
    let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let VC = storyboard.instantiateViewController(withIdentifier: "First") as! ViewController
    let frontNavigationController = UINavigationController(rootViewController: VC)
    let VC2 = storyboard.instantiateViewController(withIdentifier: "TableView") as! TableView
    let rearNavigationController = UINavigationController(rootViewController: VC2)
    let revealVC = SWRevealViewController(rearViewController: rearNavigationController, frontViewController: frontNavigationController)
    revealVC.delegate = self
    self.window?.rootViewController = nil
    self.window?.rootViewController = revealVC
    self.window?.makeKeyAndVisible()

    return true
}

如果这不起作用,或者您希望实现的目标,请在评论中提问。

编辑:

因此,如果要在左侧显示TableView菜单,则必须将其故事板ID设置为TableView(obvs在故事板中设置此项)。然后上面的代码应该可以工作。

我不完全确定您使用UserDefaults保存VC的原因。但您现在可以使用TableView类在VC之间导航。如果要保存上次访问的VC并在应用程序完成启动时显示,则需要:

var string = ""
switch viewCount {
case 0:
  string = "First"
case 1:
  string = "Second"
case 2:
  string = "Third"
case 3:
  string = "Fourth"
case 4:
  string = "Fifth"
default:
  string = "First"
}
let VC = storyboard.instantiateViewController(withIdentifier: string)
let frontNavigationController = UINavigationController(rootViewController: VC)

确保您已将每个VC的故事板ID设置为&#34; First&#34;,&#34; Second&#34;,&#34; Third&#34;等等。这将取代之前答案中let VClet frontNavigationController的先前声明。