- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Swift 的初学者,我创建了一个有 Tab Bar 的项目,Tab Bar 中的一个项目称为帐户,在这个选项卡中我首先检查用户是否登录,如果没有,它应该查看包含加入/登录按钮的 View Controller as shown in this picture然后当用户登录时它会显示 accountcontroller as shown in this picture
即使我使用导航 Controller ,我也很难为两个 View Controller 显示标签栏:(我尝试以编程方式实现标签栏,如图所示
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 :在展开可选值时意外发现 nil
认真地说,我试图实现它,但我无法实现我的想法:(请任何人帮助我:( storyboard
最佳答案
我看到这里发生了一些事情,其中一些可能与您看到的崩溃有关,但据我所知,没有任何事情与此直接相关。
1) 你的两个 guard
语句都从你的 Storyboard中实例化了一个 VC,但在下一行你实际上替换了那些实例化(这是成功的,因为它是一个 guard
而不是if
) 与“默认”代码实例化,不是你想要的我不认为。我会在这里这样做:
var accountNotLogInViewController = self.storyboard?.instantiateViewController(withIdentifier: "logInAndJoin")
if accountNotLogInViewController == nil {
accountNotLogInViewController = AccountNotLogInViewController()
}
但实际上, Storyboard实例化是您想要工作的,因此您可能不需要回退检查。
2) 当其他 View Controller 已经根据您的 Storyboard为您准备就绪时,您正在实例化其他 View Controller 而不是来自 Storyboard。
当且仅当用户已登录时,您真正需要做的只是用登录帐户 View Controller 替换帐户登录 View Controller 。那么,所有需要做的就是使用 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)
}
这假设您将已登录的 View Controller 作为 Storyboard 中的“默认”,并且此代码在 UITabBarController
类中运行,否则您只需要访问标签栏使用 setViewControllers
。希望这对您有所帮助!
关于ios - 链接到不同 View 的选项卡栏 Controller 之一取决于用户登录/注销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49614975/
我是一名优秀的程序员,十分优秀!