92 votes

Comment lister toutes les sous-vues dans un contrôleur uiview sous iOS?

Je veux lister toutes les vues secondaires dans un contrôleur uiview. J'ai essayé self.view.subviews, mais aucune des sous-vues ne sont répertoriées, par exemple, les sous-vues de la uitableviewcell ne sont pas trouvées. Une idée ?

Merci.

175voto

EmptyStack Points 32089

Vous devez itérer récursivement les sous-vues.

 - (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return; // COUNT CHECK LINE

    for (UIView *subview in subviews) {

        // Do what you want to do with the subview
        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}
 

Comme l'a commenté @Greg Meletic, vous pouvez ignorer la ligne COUNT CHECK LINE ci-dessus.

35voto

natbro Points 598

La méthode intégrée de xcode / gdb pour vider la hiérarchie des vues est utile - recursiveDescription, selon http://developer.apple.com/library/ios/#technotes/tn2239/_index.html

Il génère une hiérarchie de vues plus complète qui pourrait vous être utile:

 > po [_myToolbar recursiveDescription]

<UIToolbarButton: 0xd866040; frame = (152 0; 15 44); opaque = NO; layer = <CALayer: 0xd864230>>
   | <UISwappableImageView: 0xd8660f0; frame = (0 0; 0 0); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xd86a160>>
 

13voto

James Webster Points 16663

Vous devez imprimer de manière récursive, cette méthode comporte également des onglets basés sur la profondeur de la vue.

 -(void) printAllChildrenOfView:(UIView*) node depth:(int) d
{
    //Tabs are just for formatting
    NSString *tabs = @"";
    for (int i = 0; i < d; i++)
    {
        tabs = [tabs stringByAppendingFormat:@"\t"];
    }

    NSLog(@"%@%@", tabs, node);

    d++; //Increment the depth
    for (UIView *child in node.subviews)
    {
        [self printAllChildrenOfView:child depth:d];
    }

}
 

13voto

Francis Points 11

Voici la version rapide

  func listSubviewsOfView(view:UIView){

    // Get the subviews of the view
    var subviews = view.subviews

    // Return if there are no subviews
    if subviews.count == 0 {
        return
    }

    for subview : AnyObject in subviews{

        // Do what you want to do with the subview
        println(subview)

        // List the subviews of subview
        listSubviewsOfView(subview as UIView)
    }
}
 

7voto

Gordon Dove Points 1306

Je suis un peu en retard à la fête, mais une solution un peu plus générale:

 @implementation UIView (childViews)

- (NSArray*) allSubviews {
    __block NSArray* allSubviews = [NSArray arrayWithObject:self];

    [self.subviews enumerateObjectsUsingBlock:^( UIView* view, NSUInteger idx, BOOL*stop) {
        allSubviews = [allSubviews arrayByAddingObjectsFromArray:[view allSubviews]];
                   }];
        return allSubviews;
    }

@end
 

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