我是Swift的初学者,我创建了一个项目,其中有一个Tab栏,Tab栏中的一个项目称为帐户,在此选项卡中我首先检查用户是否登录,如果不是,则应查看包含加入/登录按钮as shown in this picture的viewcontroller 然后当用户登录时,它将显示accountcontroller as shown in this picture
即使我使用导航控制器,我也难以显示两个视图控制器的标签栏:( 我尝试以编程方式实现标签栏,如图所示
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
答案 0 :(得分:0)
我看到这里发生了一些事情,其中一些可能会参与你看到的崩溃,但没有一个与我能说的直接相关。
1)你的guard
语句都会从你的故事板中实例化一个VC,但在下一行中你实际上替换了那些实例化(这是成功的,因为它是guard
而不是if
)使用“默认”代码实例化,而不是你想要的我不认为。我在这里这样做:
var accountNotLogInViewController = self.storyboard?.instantiateViewController(withIdentifier: "logInAndJoin")
if accountNotLogInViewController == nil {
accountNotLogInViewController = AccountNotLogInViewController()
}
但实际上,故事板实例化是您想要工作的,因此您可能不需要进行后备检查。
2)基于故事板,当你的其他视图控制器已经就位时,你实际上不是从故事板中实例化它们。
当且仅当用户已登录时,您真正需要做的只是用登录帐户视图控制器替换帐户登录视图控制器。然后,只需要使用{{1}如果必要的话,你只需用登录的VC替换最后一个元素(未登录的VC)。
所以代码更像是以下内容:
setViewControllers
这假设您已将登录视图控制器作为故事板中的“默认”,并且此代码在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)
}
类中运行,否则您只需访问选项卡栏即可使用{ {1}}。希望这有帮助!