选项卡栏在嵌入导航控制器时无法识别 ViewControllers swift
Tab Bar not recognising ViewControllers when they are embedded in Navigation Controllers swift
我的界面生成器(图像)中有一个视图排列。
红色: 我的根 TabBarController 转至...
黄色: 我的 UINavControllers 已经嵌入...
绿色: 视图控制器
我试图将代码添加到 TabBarController.swift 以更改我的 ViewControllers.swift 的显示方式(模态显示代码)。
在TabBarController.swift
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if viewController is CreationViewController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "CreationVC")
controller.modalPresentationStyle = .fullScreen
self.present(controller, animated: true, completion: nil)
print("hello")
} else { print("spaghet") }
}
}
当 运行 我的应用程序时,当我触摸 CreationViewController 选项卡栏项目时无法识别代码,即使 CreationViewController 正在显示。控制台打印“spaghet”而不是“hello”。
所以我换了行
if viewController is CreationViewController
到
if tabBarController.selectedIndex == 1
现在可以使用了。
我不明白为什么当我使用“if ViewController is CreationViewController”时视图没有被识别,为什么只有当我使用“TabBarController.selectedIndex”时它才被识别。就好像选项卡栏控制器无法识别它所在的视图。顺便说一下,我已经在 Interface Builder 中为 ViewController(绿色圆圈)
提供了正确的 class (CreationViewController) 和 Storyboard ID
这是因为UITabBarController 呈现的视图控制器实际上是UINavigationController。所以当你用
检查它时它不匹配class
if viewController is CreationViewController
您可以通过简单地打印您从 'func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController)' 获得的视图控制器或在该函数上放置一个断点来测试它。
标签栏控制器持有一个 UINavigationController
,它可能持有也可能不持有你的 CreationViewController
。
您想这样测试它:
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
// make sure the selected tab contains a UINavigationController
guard let navVC = viewController as? UINavigationController else {
print("Selected tab does not contain a navigation controller")
return
}
if navVC.visibleViewController is CreationViewController {
print("CreationViewController is showing in selected tab's navigation controller")
// do something
} else {
print("Some other controller is showing in selected tab's navigation controller")
// do something else
}
}
我的界面生成器(图像)中有一个视图排列。
红色: 我的根 TabBarController 转至...
黄色: 我的 UINavControllers 已经嵌入...
绿色: 视图控制器
我试图将代码添加到 TabBarController.swift 以更改我的 ViewControllers.swift 的显示方式(模态显示代码)。
在TabBarController.swift
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if viewController is CreationViewController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "CreationVC")
controller.modalPresentationStyle = .fullScreen
self.present(controller, animated: true, completion: nil)
print("hello")
} else { print("spaghet") }
}
}
当 运行 我的应用程序时,当我触摸 CreationViewController 选项卡栏项目时无法识别代码,即使 CreationViewController 正在显示。控制台打印“spaghet”而不是“hello”。
所以我换了行
if viewController is CreationViewController
到
if tabBarController.selectedIndex == 1
现在可以使用了。 我不明白为什么当我使用“if ViewController is CreationViewController”时视图没有被识别,为什么只有当我使用“TabBarController.selectedIndex”时它才被识别。就好像选项卡栏控制器无法识别它所在的视图。顺便说一下,我已经在 Interface Builder 中为 ViewController(绿色圆圈)
提供了正确的 class (CreationViewController) 和 Storyboard ID这是因为UITabBarController 呈现的视图控制器实际上是UINavigationController。所以当你用
检查它时它不匹配classif viewController is CreationViewController
您可以通过简单地打印您从 'func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController)' 获得的视图控制器或在该函数上放置一个断点来测试它。
标签栏控制器持有一个 UINavigationController
,它可能持有也可能不持有你的 CreationViewController
。
您想这样测试它:
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
// make sure the selected tab contains a UINavigationController
guard let navVC = viewController as? UINavigationController else {
print("Selected tab does not contain a navigation controller")
return
}
if navVC.visibleViewController is CreationViewController {
print("CreationViewController is showing in selected tab's navigation controller")
// do something
} else {
print("Some other controller is showing in selected tab's navigation controller")
// do something else
}
}