在Swift中进行iOS登录/注销实现

我一直在尝试在swift中为iOS应用程序实现登录/注销流程。 这是我的故事板 –

主要故事板

在主视图控制器(蓝屏)中,我实现了以下代码来检测用户是否已经登录,然后自动将它们带到表视图控制器 –

override func viewDidAppear(animated:Bool){

if PFUser.currentUser() != nil { self.performSegueWithIdentifier("test", sender: self) } 

问题是,当我通过其中一个绿色屏幕登录或登录时,表格视图导航栏显示不同。 当用户打开应用程序并且已经登录时,“注销”按钮会正确显示,但是,通过绿色屏幕登录或登录,导航栏包含“<返回”按钮。

有人可以解释如何在故事板中以及在Swift中以编程方式实现登录/注销流程。 我已经看到了一些Objective-C示例,但似乎无法在Swift中找到一个。 如果有人有一个很好的例子,那将非常有帮助。

出现< Back按钮,因为您正在执行从登录视图控制器到标签栏控制器的推送segue。 应用程序更好的流程是让标签栏控制器成为您的初始视图控制器。 然后,在其viewDidAppear方法中,检查用户是否已登录。如果用户未登录,则以模态方式将“无动画”设置为登录视图控制器。 这一切都将在用户不注意的情况下发生,并允许您想要的故事板设置

你最好使用像这里的设置。 问题是您的登录视图也驻留在导航控制器中。 把它带到外面。 我所处的segue是一个“Show”

请记住,您可以通过向上菜单栏在视图控制器中嵌入标签栏控制器:编辑器 – >嵌入 – >标签栏控制器。

然后创建一个到标签栏控制器的segue,你很高兴。

在此处输入图像描述

但如果他们已经登录呢?

然后你想要一个布尔标志保存到NSUserDefaults ,它知道用户是否已登录。然后在NSUserDefaults中回忆一下在didFinishLaunchingWithOptionsapplicationWillEnterForeground下的Bool,类似于:

 var isLoggedIn: Bool? // Get From user defaults let loginViewController = storyboard.instantiateViewControllerWithIdentifier("Login") as! UIViewController let homeViewController = storyboard.instantiateViewControllerWithIdentifier("HomeNav") as! UIViewController if isLoggedIn { self.window?.rootViewController = homeViewController } else { self.window?.rootViewController = loginViewController } 

Swift 4在LoginViewController的登录按钮操作中

 @IBAction func abtn_login(_ sender: Any) { let appDel:AppDelegate = UIApplication.shared.delegate as! AppDelegate let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let centerVC = mainStoryBoard.instantiateViewController(withIdentifier: "InitialScreenTabBarController") as! InitialScreenTabBarController // setting the login status to true UserDefaults.standard.set(true, forKey: "isUserLoggedIn") UserDefaults.standard.synchronize() appDel.window!.rootViewController = centerVC appDel.window!.makeKeyAndVisible() } 

根据您的方案validation登录。

在具有注销按钮的View Controller中。

 @IBAction func abtn_logout(_ sender: Any) { UserDefaults.standard.set(false, forKey: "isUserLoggedIn") UserDefaults.standard.synchronize() let loginVC = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController let appDel:AppDelegate = UIApplication.shared.delegate as! AppDelegate appDel.window?.rootViewController = loginVC } 

AppDelegate中didFinishLaunchingWithOptions

 let userLoginStatus = UserDefaults.standard.bool(forKey: "isUserLoggedIn") if(userLoginStatus) { let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let centerVC = mainStoryBoard.instantiateViewController(withIdentifier: "InitialScreenTabBarController") as! InitialScreenTabBarController window!.rootViewController = centerVC window!.makeKeyAndVisible() }