2010-04-10 5 views
0

Folks Ola,Itération 'actifs' Voir Contrôleurs

Dans une application iPhone, je suis affichant des vues différentes en utilisant le addSubview: méthode SomeViewController.view. Je veux pouvoir, à tout le moins, enregistrer les contrôleurs de vue qui se trouvent dans la hiérarchie de vue affichée. Je préférerais être en mesure d'obtenir un handle à un contrôleur de vue spécifique.

Je sais comment itérer les vues, je ne vois tout simplement pas comment accéder aux contrôleurs de vue de ces vues. Je cherche quelque chose qui me donnera le type d'accès aux contrôleurs de vue que fait UINavigationController :: ViewControllers.

Je pensais que je pouvais sortir avec:

for (UIViewController* oVC in [self.view subviews])

mais cela est de ne pas avoir l'effet escompté.

Si quelqu'un a un moyen de le faire, s'il vous plaît partagez-le avec moi.

-isdi-

+0

En ce qui concerne l'utilité, je veux savoir quels viewcontrollers sont sur la pile après une série d'appels AddSubview. Dans ce cas particulier, je souhaite accéder à un contrôleur de vue particulier situé en dessous de quatre autres contrôleurs de vue. Ce que j'aurais volontiers déclaré à la personne qui a déclassé la question moins de deux minutes après l'avoir posté. – ISDi

Répondre

1

Une vue ne tient pas une référence à son contrôleur de vue (ou savoir quoi que ce soit sur les contrôleurs de vue en général), de sorte que vous devrez garder une trace de vous-même la cartographie. Si vous gardez tous vos contrôleurs de vue dans un tableau viewControllers, vous pouvez faire quelque chose comme:

- (UIViewController *) viewControllerForView:(UIView *)view { 
    for (UIViewController *viewController in viewControllers) 
     if (viewController.view == view) 
      return viewController; 
    return nil; 
} 
+0

Ola Tom. Dang. J'espérais que ce n'était pas le cas après une demi-journée à essayer différentes méthodes. Merci pour la réponse, je vais mettre en place une sorte de mécanisme de suivi dans le RootViewController. – ISDi

0

La méthode standard pour une vue d'interagir avec le contrôleur de vue qui est le propriétaire est en ayant le contrôleur de vue défini comme délégué ou cible d'action de la vue. La vue est conçue pour ne pas avoir de détails sur le délégué ou la cible d'action.

Si vous avez implémenté votre propre vue, ajoutez simplement un membre pour contenir une référence au contrôleur de vue. Ou adoptez un modèle de délégué pour la vue afin que la classe du délégué ne soit pas importante.

Si vous traitez les vues en tant que pile et que vous souhaitez conserver une pile de contrôleurs de vue le long de celle-ci, comme vous le faites pour UINavigationController, vous devez le faire manuellement. Associez chaque appel de addSubview: viewController.view avec un appel à [myViewControllerArray addObject: viewController] et supprimez le viewController du tableau lorsque la vue est supprimée de la hiérarchie de vues.

+0

Bonjour Drawnonward, Je n'avais pas pensé à définir le ViewController comme délégué. J'aime cette idée. Merci. Si je pouvais vous donner un point ou quelque chose, je le ferais. – ISDi