gpt4 book ai didi

ios - 链接到不同 View 的选项卡栏 Controller 之一取决于用户登录/注销?

转载 作者:行者123 更新时间:2023-11-28 07:51:13 26 4
gpt4 key购买 nike

我是 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com