为了账号安全,请及时绑定邮箱和手机立即绑定

如何遍历UIView的所有子视图及其子视图和子视图

如何遍历UIView的所有子视图及其子视图和子视图

隔江千里 2019-12-20 10:53:39
如何遍历UIView的所有子视图及其子视图和子视图?
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

使用递归:


// 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];


查看完整回答
反对 回复 2019-12-20
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

好了,这是我为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

用法:现在您应该遍历所有子视图并根据需要进行操作。


//disable all text fields

for(UIView *v in [self.view allSubViews])

{

     if([v isKindOfClass:[UITextField class]])

     {

         ((UITextField*)v).enabled=NO;

     }

}


查看完整回答
反对 回复 2019-12-20
?
繁花如伊

TA贡献2012条经验 获得超12个赞

Swift 3中的解决方案,subviews不包含视图本身就提供了所有功能:


extension UIView {

var allSubViews : [UIView] {


        var array = [self.subviews].flatMap {$0}


        array.forEach { array.append(contentsOf: $0.allSubViews) }


        return array

    }

}


查看完整回答
反对 回复 2019-12-20
  • 3 回答
  • 0 关注
  • 1444 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信