如何在iOS中保持登录会话?

3

我想知道在应用程序编程中,我需要在哪里更改根视图控制器。以下是我的代码

class NavigationViewController: UINavigationController {

var window: UIWindow?

override func viewDidLoad() {
    super.viewDidLoad()

    let storyBoard = UIStoryboard(name: "Main", bundle: nil)
    let newRootView = storyBoard.instantiateViewController(withIdentifier: "WelcomeViewController") as! WelcomeViewController
    let userStatus = UserDefaults.standard.bool(forKey: "isLoggedIn")
    if userStatus {
        self.window?.rootViewController = newRootView
    }

  }  
}

当用户登录时,我将isLoggedIn键的值设置为true,当用户注销时,将其设置为false,以便在此导航控制器子类中检索该值,根据该值选择根视图控制器。但它不能正常工作,每当我启动应用程序时,我仍然只能获取登录页面,尽管我已经登录了,也请不要建议我在didfinishlaunchingwithoptions方法中更改根视图控制器。有人能帮我解决这个问题吗?谢谢。


你在设备上检查过这个吗? - Ashok Londhe
模拟器对于UserDefaults的工作不正常。 - Ashok Londhe
1
尝试从故事板设置两个segue,然后根据情况从代码中执行其中一个。 - Roran
2个回答

1
如果我理解你的代码目标正确的话,你想在用户已经登录的情况下直接启动WelcomeViewController。您可以尝试创建一个名为ReplaceSegue的自定义segue,并将此ReplaceSegue设置为链接NavigationViewControllerViewController的segue。然后,您可以更改segue的目标。
class ReplaceSegue: UIStoryboardSegue {

    override func perform() {
        let storyBoard = UIStoryboard(name: "Main", bundle: nil)
        let newRootView = storyBoard.instantiateViewController(withIdentifier: "WelcomeViewController") as! WelcomeViewController
        sourceViewController.navigationController?.setViewControllers([newRootView], animated: true)
    }
}

谢谢!是的,我需要设置视图控制器,而不应该像这样做:"self.window?.rootViewController = newRootView",我应该像这样做:"self.setViewControllers([newRootView], animated: true)"。不需要使用segues,使用我上面提到的代码行就可以正常工作。 - Siddiq Mohamed
在我提供的解决方案中,你必须重写rootView Segue,将你的UINavigationViewController与LoginViewController连接起来,并复制粘贴我的代码。 - Robin Delaporte

-1

首先在 NSUserDefaults 中将用户登录布尔值设置为 true。当用户成功登录时执行此操作。

UserDefaults.standard.set(true, forKey: "USERISLOGIN")

现在打开 Appdelegate.swift 文件 -> didFinishLaunchingWithOptions 方法:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    if(UserDefaults.standard.bool(forKey: "USERISLOGIN")){

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

                let objLogoutVC = storyboard.instantiateViewController(withIdentifier: "LogoutVC") as! LogoutVC
                let navigationController = UINavigationController(rootViewController: objLogoutVC)

                navigationController.navigationBar.isTranslucent = false
                navigationController.navigationBar.isHidden = true
                self.window?.rootViewController = navigationController
                self.window?.makeKeyAndVisible()
            }
     return true
}

如果你需要任何其他的东西,请告诉我。


1
请不要建议我在didfinishlaunchingwithoptions方法内更改根视图控制器。 - Robin Delaporte
确实,@Desdenova没有把这个要求表达得足够清楚。 - Robin Delaporte
我只是编辑了问题中的代码块。显然这不是我的问题。 - Desdenova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接