加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用Swift和iOS 8 Storyboard登录屏幕

发布时间:2020-12-14 05:39:37 所属栏目:百科 来源:网络整理
导读:我在处理iOS应用程序的登录流程时遇到了很多麻烦.我想要实现的故事板的图像如下 我正在尝试实现一个可选的登录屏幕,该屏幕仅在用户首次打开应用程序并且尚未登录时显示.目前,我将Tab Bar Controller设置为根视图控制器.但是,我无法弄清楚如何处理这些视图控
我在处理iOS应用程序的登录流程时遇到了很多麻烦.我想要实现的故事板的图像如下

我正在尝试实现一个可选的登录屏幕,该屏幕仅在用户首次打开应用程序并且尚未登录时显示.目前,我将Tab Bar Controller设置为根视图控制器.但是,我无法弄清楚如何处理这些视图控制器之间的交换.

我试图用以下代码简单地按下登录屏幕.但是,它不起作用.我相信标签栏控制器不允许推送新视图控制器的问题.

func application(application: UIApplication,didFinishLaunchingWithOptions  launchOptions: [NSObject: AnyObject]?) -> Bool {
    //stuff

    if userLoggedIn {
        // Do nothing
    } else {
        //get access to login view
        var storyboard = UIStoryboard(name: "Main",bundle: nil)
        var viewController =    storyboard.instantiateViewControllerWithIdentifier("signupView") as UIViewController;

        // Then push login view
        var rootViewController = self.window!.rootViewController as UITabBarController;
        rootViewController.pushViewController(viewController,animated: true)
    }

    // Override point for customization after application launch.
    return true
}

有没有办法在不推入导航控制器的情况下切换视图控制器?任何关于如何处理这种登录流程的建议将不胜感激.

我通过“LaunchViewController”来实现这个目的,它确定它是否应该呈现Login视图或主导航控制器.

将启动视图标记为故事板中的初始视图,并在其中编写逻辑以确定要显示的内容.对于用户来说,该过程通常非常快速且不明显.

更新:

正如我在评论中所提到的,我走的是另一个方向.现在在App Delegate的应用程序(application:didFinishLaunchingWithOptions :)方法中,我执行必要的逻辑来确定哪个视图应该是rootViewController并使用以下内容将其设置在那里.

extension AppDelegate {

    enum LaunchViewController {
        case Login,Dashboard

        var viewController: UIViewController {
            switch self {
            case .Login: return StoryboardScene.Login.LoginScene.viewController()
            case .Dashboard: return StoryboardScene.Dashboard.initialViewController()
            }
        }

        /// Sets `UIWindow().rootViewController` to the appropriate view controller,by default this runs without an animation.
        func setAsRootviewController(animated animated: Bool = false) {
            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            let window = appDelegate.window!
            let launchViewController = viewController

            log.info?.message("Setting (launchViewController.dynamicType) as rootViewController")
            if let rootViewController = window.rootViewController where rootViewController.dynamicType != launchViewController.dynamicType && animated {
                let overlayView = UIScreen.mainScreen().snapshotViewAfterScreenUpdates(false)
                launchViewController.view.addSubview(overlayView)

                UIView.animateWithDuration(0.3,animations: {
                    overlayView.alpha = 0.0
                    },completion: { _ in
                        overlayView.removeFromSuperview()
                });
            }

            window.rootViewController = launchViewController
            window.restorationIdentifier = String(launchViewController.dynamicType)

            if window.keyWindow == false {
                window.makeKeyAndVisible()
            }
        }
    }
}

请注意,StoryboardScene不是默认类型,我使用https://github.com/AliSoftware/SwiftGen来生成它.

My App Delegate方法看起来像这样.

if window == nil {
    window = UIWindow(frame: UIScreen.mainScreen().bounds)
}

if isRestoringState == false {
    if let _ = lastUsedAccount {
        LaunchViewController.Dashboard.setAsRootviewController()
    } else {
        LaunchViewController.Login.setAsRootviewController()
    }
}

使用Logout方法更新注释

func handleLogout(notification: NSNotification) {
  LaunchViewController.Login.setAsRootviewController(animated: true)
  lastUsedAccount = nil
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读