如何在Swift中向下转换UIViewController

时间:2015-12-27 07:33:18

标签: swift uiviewcontroller downcast

我有几个从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
}

3 个答案:

答案 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)