如何检查特定的 UiViewcontroller(Tabbar Embedded) 是否在 navigationController 机架中?
How to check whether a specific UiViewcontroller(Tabbar Embedded) is in the navigationController rack?
我有一个 SignInVc 作为起点和一个跳过按钮。如果用户点击跳过,e 将转到主页,当他点击任何按钮时,他将被推送到登录Vc。
homeVC 有 TabBar,就像它的 4 个标签栏之一 Vc。
if let viewControllers = self.navigationController?.viewControllers {
for controller in viewControllers
{
if controller == (tabBarController?.viewControllers![0]){
print("FOUND IT")
}
print(controller)
}
}
使用断点调试时,我可以在navigationController?.viewControllers
中看到主页
但是我无法访问它!!,打印没有执行。我应该在 == 的 RHS 中使用什么?
计划是推送到 homeVC 而不是打印代码。
编辑:
我在下面添加调试的屏幕截图
我想在 索引 2
处访问视图控制器
[
我不认为你有你所描述的层次结构。
真的有
NavigationController -> TabBarController -> HomeViewController or
TabBarController -> NavigationController -> HomeViewController
属性 .navigationController
和 .tabBarController
查找最近的可访问导航和 TabBar 控制器。
只需在故事板或代码中检查您的层次结构,您就会解决您的问题。
UPD.
根据你的屏幕,你应该先找到tabBar controller,然后在tabBarController中找到HomeViewController。我想,代码应该是这样的:
if let tabBar = navController.viewControllers.first(where: { [=11=] is UITabBarController} ){
let homeController = tabController.viewControllers?.first(where: { [=11=] is HomeViewController})
print("Home controller: \(home)")
}
不知道我说的对不对,
逻辑上声明一个全局变量,
var initiateHomePage: Bool?
// 在任何 swift 文件之上或之外声明
对于按钮操作
案例 1
@IBAction func skipButtonTapped(_ sender: Any) {
initiateHomePage = true // should go homepage
}
案例 2
@IBAction func anyButtonTapped(_ sender: Any) {
initiateHomePage = false // should go SignInVC
}
最后
正在执行
if initiateHomePage == true {
// redirect to home page
// use this to redirect to tab bar
if let viewControllers = self.navigationController?.viewControllers {
for controller in viewControllers
{
if controller == (tabBarController?.viewControllers![0]){
print("FOUND IT")
}
print(controller)
}
}
// or use this
let ViewController:UIStoryboard = UIStoryboard(name: "Module", bundle: nil)
let tabBarController = ViewController.instantiateViewController(withIdentifier: "tabBar") as! UITabBarController
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = tabBarController
} else {
// redirect to SignINVC
}
我有一个 SignInVc 作为起点和一个跳过按钮。如果用户点击跳过,e 将转到主页,当他点击任何按钮时,他将被推送到登录Vc。
homeVC 有 TabBar,就像它的 4 个标签栏之一 Vc。
if let viewControllers = self.navigationController?.viewControllers {
for controller in viewControllers
{
if controller == (tabBarController?.viewControllers![0]){
print("FOUND IT")
}
print(controller)
}
}
使用断点调试时,我可以在navigationController?.viewControllers
中看到主页但是我无法访问它!!,打印没有执行。我应该在 == 的 RHS 中使用什么?
计划是推送到 homeVC 而不是打印代码。
编辑:
我在下面添加调试的屏幕截图
我想在 索引 2
处访问视图控制器[
我不认为你有你所描述的层次结构。 真的有
NavigationController -> TabBarController -> HomeViewController or
TabBarController -> NavigationController -> HomeViewController
属性 .navigationController
和 .tabBarController
查找最近的可访问导航和 TabBar 控制器。
只需在故事板或代码中检查您的层次结构,您就会解决您的问题。
UPD.
根据你的屏幕,你应该先找到tabBar controller,然后在tabBarController中找到HomeViewController。我想,代码应该是这样的:
if let tabBar = navController.viewControllers.first(where: { [=11=] is UITabBarController} ){
let homeController = tabController.viewControllers?.first(where: { [=11=] is HomeViewController})
print("Home controller: \(home)")
}
不知道我说的对不对,
逻辑上声明一个全局变量,
var initiateHomePage: Bool?
// 在任何 swift 文件之上或之外声明
对于按钮操作
案例 1
@IBAction func skipButtonTapped(_ sender: Any) {
initiateHomePage = true // should go homepage
}
案例 2
@IBAction func anyButtonTapped(_ sender: Any) {
initiateHomePage = false // should go SignInVC
}
最后
正在执行
if initiateHomePage == true {
// redirect to home page
// use this to redirect to tab bar
if let viewControllers = self.navigationController?.viewControllers {
for controller in viewControllers
{
if controller == (tabBarController?.viewControllers![0]){
print("FOUND IT")
}
print(controller)
}
}
// or use this
let ViewController:UIStoryboard = UIStoryboard(name: "Module", bundle: nil)
let tabBarController = ViewController.instantiateViewController(withIdentifier: "tabBar") as! UITabBarController
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = tabBarController
} else {
// redirect to SignINVC
}