如何在我的 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 如果他们不这样做
正确登录后,应用程序应将 window rootViewController 设置为您想要启动应用程序的任何值。
VC 堆栈应该清楚地表示您想要的东西——因此要么是登录流程要么是应用程序,但不能两者兼而有之。
我不太喜欢将 rootViewController 替换为其他视图控制器。我觉得应该保持原样。
为什么不这样做呢?
yourTabBarController.presentViewController(loginViewController,
animated: animated,
completion: nil)
这将在您的 tabBarController 顶部显示 loginViewController。您可以在用户未登录时显示它。但是当用户按下登录并且登录成功时,您可以使用以下方式显示主屏幕:
loginViewController.dismissViewControllerAnimated(true)
所以目前我将我的 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 如果他们不这样做
正确登录后,应用程序应将 window rootViewController 设置为您想要启动应用程序的任何值。
VC 堆栈应该清楚地表示您想要的东西——因此要么是登录流程要么是应用程序,但不能两者兼而有之。
我不太喜欢将 rootViewController 替换为其他视图控制器。我觉得应该保持原样。
为什么不这样做呢?
yourTabBarController.presentViewController(loginViewController,
animated: animated,
completion: nil)
这将在您的 tabBarController 顶部显示 loginViewController。您可以在用户未登录时显示它。但是当用户按下登录并且登录成功时,您可以使用以下方式显示主屏幕:
loginViewController.dismissViewControllerAnimated(true)