85 votes

Comment puis-je parcourir toutes les sous-vues d'un UIView, leurs sous-vues et leurs sous-vues

Comment puis-je parcourir toutes les sous-vues d'un UIView, leurs sous-vues et leurs sous-vues?

122voto

Ole Begemann Points 85798

Utiliser la récursivité:

 // UIView+HierarchyLogging.h
@interface UIView (ViewHierarchyLogging)
- (void)logViewHierarchy;
@end

// UIView+HierarchyLogging.m
@implementation UIView (ViewHierarchyLogging)
- (void)logViewHierarchy
{
    NSLog(@"%@", self);
    for (UIView *subview in self.subviews)
    {
        [subview logViewHierarchy];
    }
}
@end

// In your implementation
[myView logViewHierarchy];
 

36voto

Voici la solution utilisant Recursion, un wrapper (catégorie / extension) pour la classe UIView.

 // UIView+viewRecursion.h
@interface UIView (viewRecursion)
- (NSMutableArray*) allSubViews;
@end

// UIView+viewRecursion.m
@implementation UIView (viewRecursion)
- (NSMutableArray*)allSubViews
{
   NSMutableArray *arr=[[[NSMutableArray alloc] init] autorelease];
   [arr addObject:self];
   for (UIView *subview in self.subviews)
   {
     [arr addObjectsFromArray:(NSArray*)[subview allSubViews]];
   }
   return arr;
}
@end
 

Utilisation: Vous devriez maintenant parcourir toutes les vues secondaires et les manipuler.

 //disable all text fields
for(UIView *v in [self.view allSubViews])
{
     if([v isKindOfClass:[UITextField class]])
     {
         ((UITextField*)v).enabled=NO;
     }
}
 

12voto

djibouti33 Points 3807

Juste trouvé un moyen intéressant de faire cela dans le débogueur:

http://idevrecipes.com/2011/02/10/exploring-iphone-view-hierarchies/

les références d'Apple cette note technique:

http://developer.apple.com/library/ios/#technotes/tn2010/tn2239.html#SECUIKIT

Assurez-vous que votre débogueur est en pause (soit définir un point d'arrêt, de pause manuellement) et vous pouvez demander le recursiveDescription.

12voto

Je marque tout quand il est créé. Ensuite, il est facile de trouver n'importe quelle sous-vue.

 view = [aView viewWithTag:tag];
 

6voto

docchang Points 682

Avec l'aide d'Ole Begemann. J'ai ajouté quelques lignes pour incorporer le concept de bloc.

UIView + HierarchyLogging.h

 typedef void (^ViewActionBlock_t)(UIView *);
@interface UIView (UIView_HierarchyLogging)
- (void)logViewHierarchy: (ViewActionBlock_t)viewAction;
@end
 

UIView + HierarchyLogging.m

 @implementation UIView (UIView_HierarchyLogging)
- (void)logViewHierarchy: (ViewActionBlock_t)viewAction {
    //view action block - freedom to the caller
    viewAction(self);

    for (UIView *subview in self.subviews) {
        [subview logViewHierarchy:viewAction];
    }
}
@end
 

Utilisation de la catégorie HierarchyLogging dans votre ViewController. Vous êtes maintenant libre de ce que vous devez faire.

 void (^ViewActionBlock)(UIView *) = ^(UIView *view) {
    if ([view isKindOfClass:[UIButton class]]) {
        NSLog(@"%@", view);
    }
};
[self.view logViewHierarchy: ViewActionBlock];
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X