链接到不同视图的选项卡栏控制器之一取决于用户日志 in/out?
one of Tab Bar Controllers linked to different views depend on user log in/out?
我是Swift的初学者,我创建了一个有Tab Bar的项目,Tab Bar中的一个项目叫做account,在这个tab中我首先检查用户是否登录如果不是,它应该查看包含 join/login 按钮 as shown in this picture 的 viewcontroller
然后当用户登录时它会显示 accountcontroller as shown in this picture
即使我使用导航控制器,我也很难显示两个 viewcontroller 的标签栏:(
我尝试以编程方式实现选项卡栏,如图所示
let homeViewController = HomeViewController()
homeViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Apatite logo"), tag: 0)
let searchViewController = SearchViewController()
searchViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Search "), tag: 1)
let addToBagViewController = AddToBagViewController()
addToBagViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Add2Bag"), tag: 2)
Auth.auth().addStateDidChangeListener { (auth, user) in
if user != nil {
guard var userAccountTableViewController = self.storyboard?.instantiateViewController(withIdentifier: "UserLogIn") else {
return
}
userAccountTableViewController = UserAccountTableViewController()
userAccountTableViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Account"), tag: 3)
let viewControllerList = [ homeViewController, searchViewController, addToBagViewController, userAccountTableViewController]
self.viewControllers = viewControllerList
} else {
guard var accountNotLogInViewController = self.storyboard?.instantiateViewController(withIdentifier: "logInAndJoin") else {
return
}
accountNotLogInViewController = AccountNotLogInViewController()
accountNotLogInViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Account"), tag: 3)
self.setViewControllers([homeViewController, searchViewController,addToBagViewController, accountNotLogInViewController], animated: true)
}
}
但它不起作用它显示 fatal error: unexpectedly found nil while unwrapping an Optional value
认真地说,我试图实现它,但我无法实现我的想法:(请任何人帮助我:(
storyboard
我看到这里发生了几件事,其中一些可能与您看到的崩溃有关,但 none 与我所知道的直接相关。
1) 你的两个 guard
语句都从你的情节提要中实例化了一个 VC,但在下一行你实际上替换了那些实例化(这是成功的,因为它不是 guard
if
) 和 "default" 代码实例化,我不认为这不是你想要的。我会在这里这样做:
var accountNotLogInViewController = self.storyboard?.instantiateViewController(withIdentifier: "logInAndJoin")
if accountNotLogInViewController == nil {
accountNotLogInViewController = AccountNotLogInViewController()
}
但实际上,故事板实例化是您想要工作的,因此您可能不需要回退检查。
2) 当其他视图控制器已经根据您的故事板为您准备就绪时,您正在实例化其他视图控制器而不是来自故事板。
当且仅当用户已登录时,您真正需要做的只是用登录帐户视图控制器替换帐户登录视图控制器。那么,所有需要做的就是使用 setViewControllers
方法,如果有必要,您只需将最后一个元素(未登录的 VC)替换为已登录的 VC。
所以代码会更像下面这样:
Auth.auth().addStateDidChangeListener { (auth, user) in
if user == nil {
var accountNotLogInViewController = self.storyboard?.instantiateViewController(withIdentifier: "logInAndJoin")
accountNotLogInViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Account"), tag: 3)
var currentViewControllers = self.viewControllers
currentViewControllers.removeLast()
currentViewControllers.append(accountNotLogInViewController)
self.setViewControllers(currentViewControllers, animated: true)
}
这假设您已登录视图控制器作为故事板中的 "default",并且此代码在 UITabBarController
class 中是 运行,否则您只需访问标签栏即可使用 setViewControllers
。希望这对您有所帮助!
我是Swift的初学者,我创建了一个有Tab Bar的项目,Tab Bar中的一个项目叫做account,在这个tab中我首先检查用户是否登录如果不是,它应该查看包含 join/login 按钮 as shown in this picture 的 viewcontroller 然后当用户登录时它会显示 accountcontroller as shown in this picture
即使我使用导航控制器,我也很难显示两个 viewcontroller 的标签栏:( 我尝试以编程方式实现选项卡栏,如图所示
let homeViewController = HomeViewController()
homeViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Apatite logo"), tag: 0)
let searchViewController = SearchViewController()
searchViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Search "), tag: 1)
let addToBagViewController = AddToBagViewController()
addToBagViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Add2Bag"), tag: 2)
Auth.auth().addStateDidChangeListener { (auth, user) in
if user != nil {
guard var userAccountTableViewController = self.storyboard?.instantiateViewController(withIdentifier: "UserLogIn") else {
return
}
userAccountTableViewController = UserAccountTableViewController()
userAccountTableViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Account"), tag: 3)
let viewControllerList = [ homeViewController, searchViewController, addToBagViewController, userAccountTableViewController]
self.viewControllers = viewControllerList
} else {
guard var accountNotLogInViewController = self.storyboard?.instantiateViewController(withIdentifier: "logInAndJoin") else {
return
}
accountNotLogInViewController = AccountNotLogInViewController()
accountNotLogInViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Account"), tag: 3)
self.setViewControllers([homeViewController, searchViewController,addToBagViewController, accountNotLogInViewController], animated: true)
}
}
但它不起作用它显示 fatal error: unexpectedly found nil while unwrapping an Optional value
认真地说,我试图实现它,但我无法实现我的想法:(请任何人帮助我:(
storyboard
我看到这里发生了几件事,其中一些可能与您看到的崩溃有关,但 none 与我所知道的直接相关。
1) 你的两个 guard
语句都从你的情节提要中实例化了一个 VC,但在下一行你实际上替换了那些实例化(这是成功的,因为它不是 guard
if
) 和 "default" 代码实例化,我不认为这不是你想要的。我会在这里这样做:
var accountNotLogInViewController = self.storyboard?.instantiateViewController(withIdentifier: "logInAndJoin")
if accountNotLogInViewController == nil {
accountNotLogInViewController = AccountNotLogInViewController()
}
但实际上,故事板实例化是您想要工作的,因此您可能不需要回退检查。
2) 当其他视图控制器已经根据您的故事板为您准备就绪时,您正在实例化其他视图控制器而不是来自故事板。
当且仅当用户已登录时,您真正需要做的只是用登录帐户视图控制器替换帐户登录视图控制器。那么,所有需要做的就是使用 setViewControllers
方法,如果有必要,您只需将最后一个元素(未登录的 VC)替换为已登录的 VC。
所以代码会更像下面这样:
Auth.auth().addStateDidChangeListener { (auth, user) in
if user == nil {
var accountNotLogInViewController = self.storyboard?.instantiateViewController(withIdentifier: "logInAndJoin")
accountNotLogInViewController.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "Account"), tag: 3)
var currentViewControllers = self.viewControllers
currentViewControllers.removeLast()
currentViewControllers.append(accountNotLogInViewController)
self.setViewControllers(currentViewControllers, animated: true)
}
这假设您已登录视图控制器作为故事板中的 "default",并且此代码在 UITabBarController
class 中是 运行,否则您只需访问标签栏即可使用 setViewControllers
。希望这对您有所帮助!