Comment puis-je parcourir toutes les sous-vues d'un UIView, leurs sous-vues et leurs sous-vues?
Réponses
Trop de publicités?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];
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;
}
}
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.
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];