ios - 如何在我的 TabViewController 之前添加登录屏幕

标签 ios xcode swift authentication viewcontroller

所以目前我的 AppDelegate 设置为使我的 CustomTabBarController 成为 Root View Controller :

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    FIRApp.configure()

    // Override point for customization after application launch.
    window = UIWindow(frame: UIScreen.mainScreen().bounds)
    window?.makeKeyAndVisible()

    window?.rootViewController = CustomTabBarController()

    return true
}

在我的 TabBarController.swift 文件中,我重写了 viewDidLoad 函数:

override func viewDidLoad() {
    super.viewDidLoad()

    // Custom view controllers
    let layout = UICollectionViewFlowLayout()
    let friendsController = ContactsController(collectionViewLayout: layout)
    let recentMessagesNavController = UINavigationController(rootViewController: friendsController)
    recentMessagesNavController.tabBarItem.title = "DMs"
    recentMessagesNavController.tabBarItem.image = UIImage(named: "")

    viewControllers = [recentMessagesNavController, createDummyNavControllerWithTitle("Groups", imageName: ""), createDummyNavControllerWithTitle("Submit", imageName: ""), createDummyNavControllerWithTitle("Search", imageName: ""), createDummyNavControllerWithTitle("Other", imageName: "")]
}

接下来我的 ContactsController.swift 文件有这个:

private let cellID = "cellID"
override func viewDidLoad() {
    super.viewDidLoad()

    // Navigation bar
    navigationItem.title = "Direct Messages"
    collectionView?.backgroundColor = UIColor.whiteColor()
    collectionView?.alwaysBounceVertical = true
    collectionView?.registerClass(MessageCell.self, forCellWithReuseIdentifier: cellID)
    setupData()

    // Fetch messages provided by the fetch controller
    do {
        try fetchedResultsController.performFetch()
    } catch let err {
        print(err)
    }

}

我目前没有 Storyboard文件,因为我的所有 View 都是以编程方式创建的。我一直在尝试添加一个登录屏幕,如果用户未登录,它将弹出并阻止 TabBarController,但我无法找出实现此操作而不会出错的最佳方法。目前我的 SignInViewController 确实有以编程方式创建的自定义元素。解决我的问题的方法是什么?

编辑评论: 目前我的 SignInViewController 有这个:

override func viewDidAppear(animated: Bool) {

    if let user = FIRAuth.auth()?.currentUser {
        self.signedIn(user)
    }

    collectionView?.registerClass(BaseCell.self, forCellWithReuseIdentifier: cellID)
    collectionView?.backgroundColor = UIColor.blueColor()
    collectionView?.alwaysBounceVertical = false
    tabBarController?.tabBar.hidden = true

    view.addSubview(loginContainerView)
    view.addConstraintWithFormat("H:|[v0]|", views: loginContainerView)
    view.addConstraintWithFormat("V:|[v0]|", views: loginContainerView)
    setupInputComponents()
}

private let cellID = "cellID"
var bottomConstraint: NSLayoutConstraint?

private func setupInputComponents() {
    let loginControls = UIView()
    loginControls.backgroundColor = UIColor.yellowColor()
    loginContainerView.addSubview(emailField)
    loginContainerView.addSubview(passwordField)
    loginContainerView.addSubview(loginButton)
    loginContainerView.addSubview(signUpButton)
    loginContainerView.addSubview(passwordResetButton)
    loginContainerView.addConstraintWithFormat("H:|[v0]|", views: emailField)
    loginContainerView.addConstraintWithFormat("V:|[v0]|", views: emailField)
    loginContainerView.addConstraintWithFormat("H:|[v0]|", views: passwordField)
    loginContainerView.addConstraintWithFormat("V:|[v0]|", views: passwordField)
    loginContainerView.addConstraintWithFormat("H:|[v0]|", views: loginButton)
    loginContainerView.addConstraintWithFormat("V:|[v0]|", views: loginButton)
    loginContainerView.addConstraintWithFormat("H:|[v0]|", views: signUpButton)
    loginContainerView.addConstraintWithFormat("V:|[v0]|", views: signUpButton)
    loginContainerView.addConstraintWithFormat("H:|[v0]|", views: passwordResetButton)
    loginContainerView.addConstraintWithFormat("V:|[v0]|", views: passwordResetButton)
}

最佳答案

我不太喜欢将 rootViewController 替换为其他 View Controller 。我认为它应该保持原样。

为什么不这样做呢?

yourTabBarController.presentViewController(loginViewController, 
                                   animated: animated,
                                 completion: nil)

这将在 tabBarController 的顶部显示 loginViewController。您可以在用户未登录时显示它。但是当用户按下登录并且登录成功时,您可以使用以下方式显示主屏幕:

loginViewController.dismissViewControllerAnimated(true)

关于ios - 如何在我的 TabViewController 之前添加登录屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37911040/

相关文章:

ios - UICollection NumberOfItemsInSection 向 vars 添加常量的问题

ios - 快捷方式的 Siri Intent Donation 以错误结束

ios - 我的 iOS 应用程序在模拟器中运行,但当我尝试在手机上打开它时立即崩溃

ios - 创建IOS模拟器构建但缺少预制件

xcode - 狮子错误地保留了焦点

swift - 在 Swift 中,如何在继续代码之前安全地确保从 Google 检索数据(日期和时间)?

Swift 3 类型推理混淆

ios - 使用 PropertyListSerialization 在 swift 2 中制作字典

ios - 如何为我的 iOS 设备复制应用程序?

ios - 如何在 UIView 中呈现 SFSafariViewController