2009-11-24 8 views
2

ont cherché une réponse à celui-ci, mais n'arrive pas à trouver une solution définitive - en espérant que quelqu'un puisse aider ici!iPhone - appelant une méthode dans le contrôleur de vue parents

Je construis une application multiview pour l'iPhone. J'ai créé un UIViewController appelé "MainViewController", qui se charge dans d'autres vues si nécessaire. Il y a beaucoup de navigation entre les écrans, donc ce que je voudrais faire, c'est avoir une méthode "ViewSwitcher" dans MainViewController que les contrôleurs de vue enfants peuvent appeler pour demander à la vue de passer à une autre vue enfant. Comment appeler la méthode "ViewSwitcher" à partir des contrôleurs enfants?

Comment appeler la méthode "ViewSwitcher" à partir des contrôleurs enfants? J'ai réussi à réaliser ceci actuellement en créant une propriété "parent" UIView * dans chaque contrôleur de vue enfant, et en remplissant ceci au premier chargement de la vue enfant. Je peux ensuite appeler la méthode en utilisant [parent ViewSwitcher]. Cela semble un peu maladroit, et je crains de créer une structure horriblement récursive. Y a-t-il un meilleur moyen?

Merci d'avance.

Répondre

0

Vous pouvez créer un objet singleton. Ce cocoawithlove article fait un travail magnifique sur ce sujet.

+0

Très apprécié - J'ai eu un chalut à travers et il semble logique. Je commençais juste à m'inquiéter de mettre en place des pointeurs sur la vue parent dans chaque structure de vue! Merci beaucoup! –

3

est ici quelque chose qui ressemble maladroit, mais il devrait démontrer l'idée générale:

NSArray *viewControllerArray = [self.navigationController viewControllers]; 
int parentViewControllerIndex = [viewControllerArray count] - 2; 
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"]; 

Une grande partie de cela peut facilement être remplacé par un #define macro:

#define CurrentParentViewController [[self.navigationController viewControllers] objectAtIndex:[[self.navigationController viewControllers] count] - 2] 

Vous pourriez alors utiliser comme suit:

[CurrentParentViewController setBackBarButtonItemTitle:@"New Title"]; 

Ceci provoquerait évidemment un crash et une brûlure si vous appelez cela un t le contrôleur de vue le plus bas dans la pile de navigation, mais probablement vous le savez quand vous utilisez cette approche. Vous pouvez, par exemple, appeler le [[self.navigationController viewControllers] count] pour vous assurer que vous pouvez l'exécuter.

+0

Un grand merci pour cela. Si je comprends bien, vous mettrez ceci dans la vue enfant et vous obtiendrez * chaque * contrôleur de vue que le contrôleur parent a défini. Si je suis ce droit - comment savez-vous qu'il est décalé de deux? Est-ce parce que la dernière entrée sera (compte-1) et correspondra à la vue actuelle et l'avant-dernière (chef-2) sera son propriétaire immédiat? Un grand merci pour la réponse rapide! –

+0

Les index de tableau sont basés sur 0: Array [0] est le premier élément, Array [1] est le deuxième élément, etc. L'index du contrôleur de vue actuel sera l'index (length-1) des '-viewControllers' tableau. L'index du contrôleur de vue parent du contrôleur de vue actuel sera à l'index (longueur-2) du tableau '-viewControllers'. –

+0

Voilà ce que je pensais - merci! –

Questions connexes