首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何根据全局变量决定要显示的视图

如何根据全局变量决定要显示的视图
EN

Stack Overflow用户
提问于 2019-03-18 06:48:23
回答 1查看 54关注 0票数 0

我正在尝试实现一个IOS swift应用程序,它从一个标签栏控制器开始,其中一个标签栏控制器中有一个名为"account“的项目。

当用户按下帐户项目时,我希望应用程序(onclick事件)根据全局变量"loggedIn“(布尔型)决定是显示包含注册/登录的视图还是显示配置文件视图。

(我尝试过导航控制器,但我从中了解到的是,它是一个视图序列,无法在视图之间做出决定)

我想知道这是如何实现的,如果你可能的话,也许是某种“路由器”,可以在视图之间切换……

如果你不明白,这里有一张我正在尝试实现的图片

Basic Map of what I'm trying to explain

如果你能提出一种更专业的方式来做这样的设计,请不要犹豫,表达你的意见。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-18 08:08:26

我认为当loggedIn状态改变时更新视图控制器是一个很好的方法。如果还没有,可以创建一个继承自UITabBarController的类来管理选项卡。代码如下:

代码语言:javascript
复制
class TabController: UITabBarController {}

在故事板中,选择选项卡控制器,转到Identity Inspector并将TabController设置为自定义类。现在,TabController将管理选项卡栏中的所有视图控制器。

使用全局变量通常不是一个好方法,所以让我们在TabController的作用域中添加loggedIn,并侦听其中的任何更改并更新相应的视图控制器:

代码语言:javascript
复制
class TabController: UITabBarController {
  var loggedIn = true {
    didSet {
      updateProfileTab()
    }
  }
}

现在,每当您更改loggedIn时,所做的更改都会更新相应的选项卡。现在让我们编写updateProfileTab()

代码语言:javascript
复制
class TabController: UITabBarController {
  func updateProfileTab() {
    let viewController: UIViewController
    if loggedIn {
      viewController = makeProfileViewController()
    } else {
      viewController = makeLoginViewController()
    }
    setViewController(viewController, at: 2)
  }

  func makeProfileViewController() -> ProfileViewController {
    // create and return the profile view controller
  }

  func makeLoginViewController() -> LoginViewController {
    // create and return the profile view controller
  }
}

当然,您可能希望同时编写makeProfileViewControllermakeLoginViewController方法的主体。TabController的最后一件事是编写setViewController(_:at:)方法:

代码语言:javascript
复制
class TabController: UITabBarController {
  ...
  func setViewController(_ viewController: UIViewController, at index: Int) {
    let tabBarItem = viewControllers?[index].tabBarItem
    viewController.tabBarItem = tabBarItem
    viewControllers?[index] = viewController
  }
  ...
}

现在,由于TabController管理您的选项卡栏,您可以从它的任何子视图控制器中访问它:

代码语言:javascript
复制
guard let tabController = tabBarController as? TabController else { return }
tabController.loggedIn = ...

另外,选择初始状态也很重要。因此,在选项卡式视图控制器之一的viewDidLoad中,您应该执行上述代码。第一个选项卡(最先显示的那个)可能是执行此操作的最佳位置。希望这能有所帮助!

编辑

要创建登录和注册视图控制器,最简单的方法是在故事板中分配in。为此,转到您的故事板,选择视图控制器,并在Identity Inspector中设置一个Storyboard ID,您将使用它来实例化视图控制器:

代码语言:javascript
复制
func makeProfileViewController() -> ProfileViewController {
    let controller = self.storyboard!.instantiateViewController(withIdentifier: "theStoryboardID")
    return controller as! ProfileViewController
}

请注意,我在这里使用了强制展开(!)。这只是为了简单起见。在实际场景中,您需要使用一些if letguard let语句来处理nil值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55212720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档