我已经以编程方式设置了一个带有三个选项卡的自定义UITabBarControler,每个选项卡都是嵌入UINavigationController的UIViewController。
我没有使用故事板。我将自定义选项卡控制器设置为AppDelegate中的根
let ordersVC = OrdersViewController() // where Orders is a UIViewController
ordersVC.title = "Orders"
ordersVC.view.backgroundColor = UIColor.white
let ordersVCNavi = UINavigationController(rootViewController: ordersVC)
ordersVCNavi.navigationBar.tintColor = UIColor.black
...
viewControllers = [homeVCNavi, inventoryVCNavi, ordersVCNavi]
应用程序运行正常,我得到三个标签,可以在它们之间移动。
填充标签的示例(在客户标签栏控制器的viewDidLoad中)
let vc = LoginViewController()
self.navigationController?.pushViewController(vc, animated: false)
现在我需要先查看用户是否已登录(使用Firebase)。我可以轻松检查已登录(Firebase缓存)或未登录。
我这样做是登录AppDelegate检查
我的问题是当我需要强制登录时(跳转到登录视图控制器)。我找不到一个有用的地方 - 尝试将调用放在自定义UITabBarController didLoad中,并忽略代码 - 尝试将调用放在didLoad中,初始标签控制器中的willAppear也被忽略
我可以在初始标签上放置一个按钮,该按钮确实会启动登录控制器。所以我可以通过按下按钮进入登录控制器。
按下按钮后我可以执行此代码,登录控制器将显示
viewDidLoad()
但是,如果我知道我需要强制登录,并尝试在初始标签控制器中的viewWillAppear()
或{{1}}或自定义UITabBarController中执行相同的代码剪切,则忽略推送。没有任何事情发生。
当初始视图是tabbarcontroller时,强制登录屏幕的最佳做法是什么?
如果没有登录,应该将导航设置到登录控制器以强制登录。想要登录以便用户在未登录时无法使用该应用程序。
答案 0 :(得分:1)
didFinishLaunchingWithOptions
中的
if loggedIn {
window?.rootViewController = CustomTabBarController()
}
else {
window?.rootViewController = LoginViewController()
}
登录成功后
UIApplication.shared.keyWindow?.rootViewController = CustomTabBarController()