我正在尝试实现一个IOS swift应用程序,它从一个标签栏控制器开始,其中一个标签栏控制器中有一个名为"account“的项目。
当用户按下帐户项目时,我希望应用程序(onclick事件)根据全局变量"loggedIn“(布尔型)决定是显示包含注册/登录的视图还是显示配置文件视图。
(我尝试过导航控制器,但我从中了解到的是,它是一个视图序列,无法在视图之间做出决定)
我想知道这是如何实现的,如果你可能的话,也许是某种“路由器”,可以在视图之间切换……
如果你不明白,这里有一张我正在尝试实现的图片
Basic Map of what I'm trying to explain
如果你能提出一种更专业的方式来做这样的设计,请不要犹豫,表达你的意见。
发布于 2019-03-18 08:08:26
我认为当loggedIn
状态改变时更新视图控制器是一个很好的方法。如果还没有,可以创建一个继承自UITabBarController
的类来管理选项卡。代码如下:
class TabController: UITabBarController {}
在故事板中,选择选项卡控制器,转到Identity Inspector
并将TabController
设置为自定义类。现在,TabController
将管理选项卡栏中的所有视图控制器。
使用全局变量通常不是一个好方法,所以让我们在TabController
的作用域中添加loggedIn
,并侦听其中的任何更改并更新相应的视图控制器:
class TabController: UITabBarController {
var loggedIn = true {
didSet {
updateProfileTab()
}
}
}
现在,每当您更改loggedIn
时,所做的更改都会更新相应的选项卡。现在让我们编写updateProfileTab()
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
}
}
当然,您可能希望同时编写makeProfileViewController
和makeLoginViewController
方法的主体。TabController
的最后一件事是编写setViewController(_:at:)
方法:
class TabController: UITabBarController {
...
func setViewController(_ viewController: UIViewController, at index: Int) {
let tabBarItem = viewControllers?[index].tabBarItem
viewController.tabBarItem = tabBarItem
viewControllers?[index] = viewController
}
...
}
现在,由于TabController
管理您的选项卡栏,您可以从它的任何子视图控制器中访问它:
guard let tabController = tabBarController as? TabController else { return }
tabController.loggedIn = ...
另外,选择初始状态也很重要。因此,在选项卡式视图控制器之一的viewDidLoad
中,您应该执行上述代码。第一个选项卡(最先显示的那个)可能是执行此操作的最佳位置。希望这能有所帮助!
编辑
要创建登录和注册视图控制器,最简单的方法是在故事板中分配in。为此,转到您的故事板,选择视图控制器,并在Identity Inspector
中设置一个Storyboard ID
,您将使用它来实例化视图控制器:
func makeProfileViewController() -> ProfileViewController {
let controller = self.storyboard!.instantiateViewController(withIdentifier: "theStoryboardID")
return controller as! ProfileViewController
}
请注意,我在这里使用了强制展开(!
)。这只是为了简单起见。在实际场景中,您需要使用一些if let
或guard let
语句来处理nil
值。
https://stackoverflow.com/questions/55212720
复制相似问题