iphone - bar - UIViewController: détection de drill-down et de drill-up




swift navigation bar (3)

Existe-t-il un moyen pour un UIViewController (à l'intérieur d'une pile de navigation) de détecter s'il apparaît parce qu'un drill-down ou un drill-up a été effectué?

Dans viewWillAppear, les commandes topViewController et visibleViewController de UINavigationController sont déjà définies sur le nouveau ViewController, malheureusement.


Avez-vous simplement besoin de savoir ce que seront les contrôleurs de vues précédent et suivant? Ou avez-vous besoin de savoir spécifiquement si un contrôleur de vue a été sauté ou poussé? Vous pouvez implémenter la méthode suivante, qui est définie par UINavigationControllerDelegate :

- ( void )navigationController:( UINavigationController * )navigationController willShowViewController:( UIViewController * )viewController animated:( BOOL )animated
{
    UIViewController * currentController = navigationController.visibleViewController;
    UIViewController * nextController = viewController;

    // Do whatever here.
}

Si, cependant, vous avez besoin de savoir si un contrôleur de vue particulier a été sauté ou poussé, alors la suggestion de Matt Bridges est la voie à suivre.


Une autre méthode consiste à stocker les contrôleurs de vue que vous explorez en tant que variables locales de classe. Dans viewWillAppear, vous savez que vous avez été touché en raison d'un zoom avant si l'une des variables locales de la classe est toujours définie. Vous savez même de quel contrôleur l'utilisateur est revenu, vous pouvez donc faire une logique différente (comme récupérer des valeurs modifiées à partir des contrôleurs de vue que vous avez explorés).

N'oubliez pas de libérer et de supprimer les références dans viewWillAppear afin que le système soit réinitialisé pour que les choses soient correctement reconnues.

J'aime ce mécanisme plutôt que d'avoir les contrôleurs de drill-down au courant de la vue principale en tant que délégué pour pousser les changements, car ils travaillent souvent sur une petite partie de données séparée et ne devraient pas avoir à connaître un contrôleur de vue maître. . Cela les rend plus faciles à réutiliser car ils peuvent être appelés par de nombreuses classes différentes.


Vous pourriez sous-classer UINavigationController et ajouter une propriété didPushViewController . Vous pouvez ensuite remplacer pushViewController et popViewController pour définir correctement la propriété sur true ou false, respectivement.





uinavigationcontroller