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

标签 ios swift storyboard uitabbarcontroller xcode9

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

相关文章:

swift - 当获取数据库时发现 nil 时显示一条消息

ios - HealthKit 和 Apple Watch - 如何检查锻炼是否在进行?

ios - 自动布局约束 - 具有可变高度的项目的垂直间距

ios - 使用核心数据创建新的托管对象

iphone - AVPlayer - 快退/快退

iOS Swift UIImagePickerController 仅显示持续时间低于特定长度的视频

ios - 目录中的视频缩略图

linux - 没有这样的模块 'PerfectLib'

ios - 使用 Base.lproj 的本地化 Storyboard

ios - 在 UIViewController iPad 横向模式下,默认 UIView 宽度为 768?