簡體   English   中英

如何在我的TabViewController之前添加登錄屏幕

[英]How to Add a Login Screen Before my TabViewController

所以目前我的AppDelegate設置為使我的CustomTabBarController成為根視圖控制器:

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

}

我目前沒有故事板文件,因為我的所有視圖都是以編程方式創建的。 我一直在嘗試添加一個登錄屏幕,如果用戶沒有登錄,它將彈出並阻止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)
}

典型的做法是檢查用戶是否需要登錄applicationDidFinish...然后將window.rootViewController設置為登錄VC(如果需要)和啟動VC(如果不需要)

在正確登錄時,應用程序應將窗口rootViewController設置為您要啟動應用程序的任何內容。

VC堆棧應該是您想要的清晰表示 - 所以登錄流程或應用程序,但不是兩者。

我真的不想將rootViewController替換為其他視圖控制器。 我認為它應該保持不變。

為什么不這樣做呢?

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

這將在tabBarController的頂部顯示loginViewController。 您可以在用戶未登錄時顯示它。 但是當用戶按下登錄並登錄成功時,您可以使用以下方式顯示主屏幕:

loginViewController.dismissViewControllerAnimated(true)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM