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