我有几个从UIViewController继承的视图控制器。视图嵌入在Tab栏控制器中。我实现了一个自定义视图转换控制器,以便在我点击tabbar项目时可以切换视图。我是否有可能知道toVC和fromVC究竟是什么,以便我可以执行不同的视图转换?好像就像!没有办法。当我用作?时,变量没有设置为true。什么是正确的铸造方法或任何其他方式来检查它是什么视图?感谢
func tabBarController(tabBarController: UITabBarController, animationControllerForTransitionFromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
var detail = false
var item = false
if var controller = toVC as? DetailViewController {
detail = true
}
if var controller = toVC as? ItemViewController {
item = true
}
...
return threeDAnimationController
}
答案 0 :(得分:2)
在Swift中,你可以使用is
运算符来检查它是什么类,在objc中你可以使用isKindOfClass
方法:
在objc中你可以这样做:
if ([toVC isKindOfClass:[DetailViewController class]]) {
detail = true
}
在swift中你可以做到:
if toVC is DetailViewController {
detail = true
}
答案 1 :(得分:2)
您可能遇到的一个潜在问题是将视图控制器推入UINavigationController,因此您必须弄清楚什么是可见视图控制器。我有这个方便的扩展名:
extension UIViewController {
var contentViewController: UIViewController? {
if let navigationController = self as? UINavigationController {
return navigationController.visibleViewController
} else {
return self
}
}
}
您可以将其合并到您的代码中:
func tabBarController(tabBarController: UITabBarController, animationControllerForTransitionFromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
var detail = false
var item = false
if var controller = toVC.contentViewController as? DetailViewController {
detail = true
}
if var controller = toVC.contentViewController as? ItemViewController {
item = true
}
...
return threeDAnimationController
}
答案 2 :(得分:1)
您可以创建一个开关,然后执行您想要的过渡:
switch toVC {
case is ItemViewController:
// do some stuff, should already casted I think
case is DetailViewController:
// again do some stuff
default: break
}
正如其他一些用户提到的那样,如果你将viewcontroller包装在Navigation或UISplitViewController中,你可能会遇到麻烦,因此只需创建一个像Julian J. Tejera一样的扩展,他已经在他的回答中提到过了。 (如果你随时支持iPad,还可以添加UISplitViewController)