成功登录后关闭 LoginVC

Posted

技术标签:

【中文标题】成功登录后关闭 LoginVC【英文标题】:Dismissing LoginVC after successful login 【发布时间】:2021-03-19 02:13:01 【问题描述】:

在我的应用程序中,如果用户未登录,他们将被定向到注册/登录 viewController。此逻辑发生在 SceneDelegate,我坚持尝试在用户注册后显示初始视图控制器或登录。我尝试关闭视图控制器并显示根视图控制器,但都没有奏效。以下是SceneDelegate检查登录状态后的逻辑:

        window = UIWindow(frame: windowScene.coordinateSpace.bounds)
        window?.windowScene = windowScene
        window?.rootViewController = OnboardingVC()

登录/创建帐户后,这是我在成功登录或创建帐户后尝试过的示例,但不起作用:

if let vc = self.onboardingVC?.storyboard?.instantiateViewController(identifier: "JournalVC") as? JournalVC 
     self.onboardingVC?.present(vc, animated: true, completion: nil)

self.onboardingVC?.dismiss(animated: true, completion: nil)

我浏览了一些示例,但它们都涉及AppDelegate,我没有使用,谁能指出我正确的方向?

【问题讨论】:

【参考方案1】:

假设,只是为了举例,您在应用程序委托中实现此功能的方式是:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate 
    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
        if let rvc = self.window?.rootViewController 
            let ud = UserDefaults.standard
            if ud.string(forKey: "username") != nil 
                print("app delegate: user has logged in")
                let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "userHasLoggedIn")
                self.window!.rootViewController = vc
            
        
        return true
    

那么在场景委托中完全平行的方式是:

class SceneDelegate: UIResponder, UIWindowSceneDelegate, UISplitViewControllerDelegate 
    var window: UIWindow?
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
        if let rvc = self.window?.rootViewController 
            let ud = UserDefaults.standard
            if ud.string(forKey: "username") != nil 
                print("scene delegate: user has logged in")
                let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "userHasLoggedIn")
                self.window!.rootViewController = vc
            
        
    

【讨论】:

(取自我的github.com/mattneub/RegistrationExample) 是的,我理解这个逻辑,但我的问题是用户注册后要立即做什么。如何摆脱登录 VC/从该 loginVC 呈现 rootVC【参考方案2】:

您必须在场景委托中编写一个函数,以在成功登录后显示视图控制器

在您的场景委托中编写一个函数

func launchJourneyViewController() 
    let journeyViewController = JourneyViewController()
    window?.rootViewController = journeyViewController
    window?.makeKeyAndVisible() 

登录成功后,在你的登录视图控制器中,你可以编写一个函数

func onLoginSuccess() 
  let scene = UIApplication.shared.connectedScenes.first
    if let sceneDelegate : SceneDelegate = (scene?.delegate as? SceneDelegate)    
      sceneDelegate.launchJourneyViewController()
     

这考虑到您的应用程序中只有一个场景

【讨论】:

以上是关于成功登录后关闭 LoginVC的主要内容,如果未能解决你的问题,请参考以下文章

更改窗口 rootViewController 后出现 UITabBarController

模态 UINavigationController 隐藏但不关闭

成功登录后无法关闭 UIViewController

Spring Security仅在成功登录后显示主页[关闭]

成功登录后 SwiftUI Firebase 身份验证关闭视图

成功登录JavaFX后如何切换主屏幕[关闭]