J'ai plusieurs contrôleurs de vue hérités de UIViewController. Les vues sont intégrées dans le contrôleur de la barre d'onglets. J'implémente un contrôleur de transition de vue personnalisé afin que la vue puisse être changée lorsque je tape sur l'élément de la barre d'onglets. Est-il possible que je sache ce que sont exactement les toVC et fromVC afin de pouvoir effectuer différentes transitions de vue? Il semble que comme! ne fait pas l'affaire. Les variables ne sont pas définies sur true lorsque j'utilise as ?. Quelle est la bonne façon de faire un casting ou toute autre façon de vérifier de quelle vue il s'agit? Merci

    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
thsieh 27 déc. 2015 à 10:33

3 réponses

Meilleure réponse

Un problème potentiel que vous pourriez rencontrer est d'avoir vos contrôleurs de vue poussés dans un UINavigationController, par conséquent, vous devrez déterminer quel est le contrôleur de vue visible. J'ai cette extension pratique:

extension UIViewController {
    var contentViewController: UIViewController? {
        if let navigationController = self as? UINavigationController {
            return navigationController.visibleViewController
        } else {
            return self
        }
    }
}

Vous pouvez l'incorporer dans votre code comme ceci:

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
Julian J. Tejera 27 déc. 2015 à 14:45

Dans Swift, vous pouvez utiliser l'opérateur is pour vérifier de quelle classe il s'agit et dans objc, vous pouvez utiliser la méthode isKindOfClass:

Dans objc, vous pouvez faire:

if ([toVC isKindOfClass:[DetailViewController class]]) { detail = true }

En un rien de temps, vous pouvez faire:

if toVC is DetailViewController { detail = true }

2
Joe Benton 27 déc. 2015 à 13:27

Vous pouvez simplement créer un commutateur où vous effectuez ensuite votre transition de désir:

switch toVC {
    case is ItemViewController:
        // do some stuff, should already casted I think
    case is DetailViewController:
        // again do some stuff
    default: break
}

Et comme certains autres utilisateurs l'ont mentionné ici, vous pourriez avoir des problèmes si vous enveloppez votre viewcontroller dans un Navigation ou UISplitViewController, alors créez simplement une extension comme Julian J. Tejera déjà mentionnée dans sa réponse. (ajoutez également UISplitViewController comme étui si vous prenez en charge l'iPad à tout moment)

1
Christian 'fuzi' Orgler 27 déc. 2015 à 14:49