Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有Swift和iOS 8情节提要的登录屏幕_Ios_Xcode_Swift - Fatal编程技术网

带有Swift和iOS 8情节提要的登录屏幕

带有Swift和iOS 8情节提要的登录屏幕,ios,xcode,swift,Ios,Xcode,Swift,我在处理iOS应用程序的登录流时遇到了很多问题。下面是我试图实现的故事板的图像 我正在尝试实现一个可选的登录屏幕,只有当用户第一次打开应用程序并且尚未登录时才会显示该屏幕。目前,我将选项卡栏控制器设置为根视图控制器。但是,我不知道如何处理这些视图控制器之间的交换 我尝试用下面的代码简单地推送登录屏幕。但是,它不起作用。我认为问题在于不允许选项卡栏控制器推送新的视图控制器 func application(application: UIApplication, didFinishLaun

我在处理iOS应用程序的登录流时遇到了很多问题。下面是我试图实现的故事板的图像

我正在尝试实现一个可选的登录屏幕,只有当用户第一次打开应用程序并且尚未登录时才会显示该屏幕。目前,我将选项卡栏控制器设置为根视图控制器。但是,我不知道如何处理这些视图控制器之间的交换

我尝试用下面的代码简单地推送登录屏幕。但是,它不起作用。我认为问题在于不允许选项卡栏控制器推送新的视图控制器

    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”来实现这一点,该控制器决定是显示登录视图还是显示主导航控制器

将启动视图标记为故事板中的初始视图,并在其中写入逻辑以确定要显示的视图。这个过程通常非常快速,用户无法察觉

更新

正如我在评论中提到的,我走了一个不同的方向。现在,在应用程序代理的
应用程序(应用程序: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
不是默认类型,我使用它来生成它

我的应用程序委托方法看起来像这样

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

if isRestoringState == false {
    if let _ = lastUsedAccount {
        LaunchViewController.Dashboard.setAsRootviewController()
    } else {
        LaunchViewController.Login.setAsRootviewController()
    }
}
使用注销方法更新评论

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

设置为LoginViewController的初始视图控制器

AppDelegate.swift
中删除并将其放置在
LoginViewController

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

运行您的项目。

以下是我所做的,效果很好:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    if (!AppData.sharedInstance.loggedIn) {
        let signInNavigation = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("SignInNavigationControllerIdentifier") as? UINavigationController
        self.window!.rootViewController = signInNavigation;
    }
    return true
}

这就是你的整个didFinishLaunchingWithOptions方法代码吗?如果用户已登录,您如何过渡到第一个控制器?我猜这是自动完成的故事板。。。在这种情况下,您试图在代码中的错误位置推送此登录视图……您是否编写逻辑来确定在viewDidLoad()或任何其他位置显示哪个登录视图?实际上,我在一个我更喜欢的新应用程序中走了另一条路。在
应用程序(应用程序:didfishlaunchingwithoptions:)
中的应用程序委托中,我确定应显示哪个视图,并将相应的视图设置为
根视图控制器
。用一些示例代码更新了我的答案。@ChrisWagner如何处理用户注销?您是否只需将
窗口的
rootViewController
更改回
.Login
视图控制器?如果是这样,您是否在过渡期间体验到糟糕的动画效果?在启动注销后,当转换回身份验证视图控制器时,我似乎会看到奇怪的动画。@NickKohrn,用我的注销方法更新。动画只是一个交叉淡入淡出,虽然不是很好,但很好。我们预计人们不会经常注销,所以我们不会花太多时间。