2017-08-22 2 views
0

Lorsqu'un UINavigationController force l'affichage d'un contrôleur de vue, le contrôleur de navigation crée sa propre instance de ce contrôleur de vue en arrière-plan. En utilisant ce contrôleur nav délégué:Des instances spécifiques d'un contrôleur de vue sont-elles accessibles sans l'utilisation de singletons?

extension Main_ProfileViewController: UINavigationControllerDelegate { 

    // called just after the navigation controller displays a view controller’s view and navigation item properties 
    open func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) { 
     print(viewController) 
    } 

} 


Cette instance peut être "déterminé". L'imprimante console quelque chose comme ceci:

<ElChapo.SomeRandomViewController: 0x7fbe8b003640> 

Ce hachage 14 caractères est différent à chaque fois que le contrôleur est poussé vue par le contrôleur de navigation si clairement qu'ils sont différents cas à chaque fois. Ma question: cette instance spécifique est-elle accessible sans utiliser de singletons? Par accessible, je veux dire accessible où je peux y déléguer un délégué et appeler des méthodes spécifiques dans cette instance spécifique.

C'est ce que je suis en train d'accomplir:

Pour faire apparaître une pile de navigation à sa racine, j'exécuter cette fonction à partir du contrôleur de vue en haut de la pile.

// pop to root 
func popToRoot() { 
    self.navigationController?.popToRootViewController(animated: true) 
} 

Cette méthode doit être appelée à partir de cette instance spécifique de ce contrôleur de vue. Si j'appelle popToRoot() d'un autre objet, comme la barre d'onglets, en lui passant un délégué, cela ne fonctionne pas car le délégué doit trouver cette instance exacte pour exécuter le pop.

+1

Lisez ce post: https://stackoverflow.com/questions/5210535/passing-data-between-view-controllers?rq=1 Cela devrait vous donner beaucoup d'informations. – DonMag

+0

Pourriez-vous expliquer pourquoi vous devez appeler un délégué pour une instance spécifique d'un contrôleur de vue? Un 'UIViewController' a un cycle de vie. Donc, vous pouvez simplement utiliser cela afin d'effectuer des actions personnalisées. De plus, si votre modèle ne change pas, vous pouvez toujours recréer le contrôleur avec le même état chaque fois que vous en créez une nouvelle.Cela peut être réalisé par injection. Sinon, vous pouvez utiliser un coordinateur de contrôleur afin de réaliser ce que vous voulez sans utiliser un singleton. Le coordinateur est une sorte de point d'entrée qui stocke les contrôleurs que le contrôleur de navigation présentera. –

+0

Comme indiqué par @DonMag, la réponse à votre question est Oui. Si vous donnez plus de détails sur la fonctionnalité exacte que vous essayez d'atteindre, nous serons peut-être en mesure de vous fournir des réponses plus utiles. – Stephen

Répondre

1

Le contrôleur Nav ne "crée pas sa propre instance", ou du moins c'est un peu confus de le voir. Cela n'apparaît que si vous utilisez des storyboards. Vous pouvez utiliser un contrôleur de navigation sans utiliser de storyboard du tout si vous le souhaitez, auquel cas vous instanciez manuellement un nouveau View Controller pour le pousser sur la pile du contrôleur de navigation. Si vous utilisez un storyboard, il contiendra des segue définis qui "poussent" le contrôleur de vue suivant à être poussé sur la pile. Ce sont les séquences du storyboard qui définissent les vues créées quand les contrôleurs sont créés. Il n'est pas nécessaire de créer un singleton pour "accéder" aux contrôleurs de vue enfant placés sur la pile de navigation. Chaque fois que l'on est poussé sur la pile du contrôleur de navigation, il sera créé par défaut, et quand il apparaîtra, à moins que vous ne mainteniez spécifiquement une référence forte (ce qui serait presque toujours une mauvaise idée), il sera détruit. Si vous n'avez pas encore sous-classé votre contrôleur de vue de navigation, faites-le, et dans la sous-classe remplacez prepare (pour: expéditeur :) par le contrôleur de navigation, pour accéder à une instance du contrôleur de vue enfant poussé sur la pile du contrôleur de navigation. Si vous souhaitez accéder à ce contrôleur de vue, soit enregistrer une référence dans cette méthode, ou, mieux, trouver dans les contrôleurs de navigation pile à l'aide d'une des propriétés suivantes du contrôleur de navigation:

var topViewController: UIViewController? 
var visibleViewController: UIViewController? 
var viewControllers: [UIViewController] 

BTW la Le numéro de référence auquel vous faites référence n'est pas un hachage mais plutôt la valeur hexadécimale d'un pointeur (par exemple l'adresse mémoire) où est stocké l'objet contrôleur de vue, mais comme vous le dites, les contrôleurs de vue distincts auront des valeurs hexadécimales distinctes.

+0

Je suis descendu dans un trou de lapin dont je n'ai pas pu sortir. Si vous pouviez regarder ce Gist et offrir une contribution, je serais éternellement endetté. https://gist.github.com/sconewolf/606a4de42988363a1801a900eb76be0e –