Swift实现iOS登录/退出功能

5
我一直在尝试使用Swift为iOS应用程序实现登录/注销流程。这是我的故事板 -

Main Storyboard

在主视图控制器(蓝色屏幕)中,我已经实现了以下代码来检测用户是否已经登录,如果是,则自动将其带到表格视图控制器 -
覆盖功能视图DidAppear(animated:Bool){
    if PFUser.currentUser() != nil {

       self.performSegueWithIdentifier("test", sender: self)

    }

问题在于,当我通过任意一个绿色屏幕登录或注册时,表格视图导航栏会出现不同的情况。当用户打开应用程序并已经登录时,“退出”按钮会正确显示,但是通过绿色屏幕登录或注册时,导航栏包含“< 返回”按钮。
有人能解释一下如何在Storyboard和Swift中以编程方式实现登录/注销流程吗?我看到过一些Objective-C的示例,但似乎找不到Swift的示例。如果有人有好的示例,那将非常有帮助。

所以,你正在试图移除“返回”按钮对吧? - Larry Pickles
在您的viewDidLoad中,如果您有一个,您必须调用UIViewController的“hidesBackButton”属性,这是让它消失的方法,如果这不是您的问题,则继续提问或回复此评论。我本来想发布一个代码示例,但现在有太多愚蠢的downvoters四处游荡了。 - Larry Pickles
1
谢谢,这是我在登录流程中遇到的问题之一。 我在viewDidLoad中添加了“self.navigationItem.hidesBackButton = true”,它非常有效! - SB2015
没问题,很高兴能为你解决问题。 - Larry Pickles
4个回答

10

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()


}

根据您的情况验证登录。

在视图控制器中设置注销按钮。

@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()
    }

在这种情况下,如果我们从rootViewController推送,则UINavigationController将为nil。因此,在设置代码后,推送操作无法工作。 因此,首先通过以下方式获取navigationController:- ** let navigationController = UINavigationController(rootViewController: centerVC) ** 然后将其设置为 ** window!.rootViewController = navigationController ** - Ashutosh Mishra

6

出现“< 返回”按钮是因为您正在从登录视图控制器推送连接到标签栏控制器。对于应用程序来说,更好的流程是将标签栏控制器设置为您的初始视图控制器。然后,在其viewDidAppear方法中,检查用户是否已登录。如果用户未登录,请以模态方式但没有动画地进行推进到您的登录视图控制器。这些都将在用户不知情的情况下发生,并允许您想要的故事板设置。


谢谢!那么我的新故事板应该如下流程吗?路径1:标签栏控制器---->主视图控制器(蓝屏)--(模态)-->登录屏幕--(模态)-->导航控制器--(推)-->表视图;路径2:标签栏控制器---->主视图控制器(蓝屏)--(模态)-->注册屏幕--(模态)-->导航控制器--(推)-->表视图。此外,我如何防止标签栏在蓝屏上显示?感谢您的帮助! - SB2015
1
选项卡栏控制器仍将具有表视图作为其选项卡项。但它还将有一个单独的流程,如下所示:选项卡栏控制器->(模态)->导航控制器->(推送)->主视图控制器(蓝屏)。因此,当应用程序启动时,它将调用选项卡栏控制器的viewWillAppear方法。在该方法中,您检查用户是否已登录。如果用户已登录,则保留选项卡栏控制器并正常使用应用程序。如果用户未登录,则modal segue到导航控制器和登录屏幕。 - keithbhunter
谢谢。问题在于,在表视图控制器上,“退出”不再起作用。如果在导航控制器中,如何关闭屏幕,使其返回到蓝色屏幕?这在模态下没有问题(这是我以前的做法),但是在推送时,self.dismissViewControllerAnimated(true, completion: {});似乎不起作用。 - SB2015
dismissViewControllerAnimated()仅用于关闭以模态方式呈现的视图。如果您想关闭推送的控制器,请使用UINavigationController方法popToViewControllerAnimated()popToRootViewControllerAnimated()popToViewController(,animated:)。请参阅文档中有关这些方法的说明。 - keithbhunter
最终,这是对我有效的流程。另外,感谢@kiethbhunter帮助我解决了注销问题! - SB2015

2

你最好采用这里的设置。问题在于你的登录视图也驻留在导航控制器中。将其移到外部即可。我放置的segue是“Show”类型。

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

然后创建一个到标签栏控制器的segue,就可以了。

enter image description here

但是如果他们已经登录了怎么办?

那么你需要将一个布尔标志保存到NSUserDefaults中,以知道用户是否已登录。然后在AppDelegate中类似于以下方式在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
        }

谢谢@Cole,但是选项卡控制器在这个解决方案中应该放在哪里? - SB2015
啊,糟糕了,我太心急了。一切都会完全相同,但是不再将“主页”视图嵌入导航控制器中,而是嵌入选项卡栏控制器中。因此,它将是 编辑器 -> 嵌入 -> 选项卡栏控制器 - Cole
故事板设置实际上没有正常工作。@keithbhunter的解决方案有效,但我现在不知道如何“退出”。有什么办法可以在点击“退出”时关闭视图控制器吗? - SB2015

1
  let mainStoryboardIpad : UIStoryboard = UIStoryboard(name: "Register", bundle: nil)
        let initialViewController  = mainStoryboardIpad.instantiateViewController(withIdentifier: "navForLanding") as! UINavigationController
        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window?.rootViewController = initialViewController
        self.window?.makeKeyAndVisible()

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