DismissViewController Swift

时间:2016-08-06 22:39:00

标签: ios swift uiviewcontroller

如果用户已登录,我的应用程序具有以下流程

Loading Screen -----> Main Screen -----> Rest of App

如果他不是,那么

和以下流程:

Loading Screen -----> Login Screen -----> Main Screen -----> Rest of App

现在我正在实施Logout功能。我已将以下代码添加到main Screen

func handleLogout() {
        if self.presentingViewController != nil {
            var vc = self.presentingViewController
            while ((vc!.presentingViewController) != nil) {
                vc = vc!.presentingViewController
            }
            vc?.dismissViewControllerAnimated(true, completion: {
            })
        }
}

1st路径跟随(用户在启动应用时登录),当应用返回Loading Screen然后加载时,此方法正常预期的Login Screen。但是,如果遵循2nd路径(用户在启动应用时未登录,并且已使用Login Screen此代码会导致{{1直接打开,整个注销过程失败。有没有办法可以确保Login Screen是始终由此代码加载的Loading Screen,无论两条路径中的哪条路径都被跟踪过。

3 个答案:

答案 0 :(得分:1)

使用展开segues!

你基本上添加一个unwind segue连接你的"主屏幕"和"登录屏幕"。给它一个标识符,你可以随时启动segue。在handleLogout

func handleLogout() {
    self.performSegueWithIdentifier("your identifier", sender: self)
}

有关如何创建展开segue的详细信息:https://www.andrewcbancroft.com/2015/12/18/working-with-unwind-segues-programmatically-in-swift/

答案 1 :(得分:0)

这只是一个建议:

AppDelegate文件中,您可以执行与此类似的操作:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        //Implement this method
        let userLoggedIn = isUserLoggedIn();
        if !userLoggedIn {
            let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
            //Instantiate the login view controller
            window?.rootViewController = storyboard.instantiateViewControllerWithIdentifier("login")
            window?.makeKeyAndVisible()
        }

        return true
    }

现在,当应用程序启动时,它将首先检查用户的登录状态并显示相应的视图。

注意:这是假设您使用故事板并且根视图控制器设置为Main Screen

答案 2 :(得分:0)

如果您使用的是Storyboard,我建议您创建纯粹用于登录视图的故事板。然后在AppDelegate DidFinishLoading方法中,如果他们需要登录或显示主故事板(如果他们已经登录),则可以显示登录故事板。您可以随时更换故事板并且易于操作。这将有助于简化流程。这是我通常在我的应用程序中执行的操作。如果您需要示例代码,请告诉我。