7

我需要一种方法来获取 a 中的所有UILabelsUIView而不必遍历UIView.

我有许多其他类型的视图,UIButtons,UIImageViews,当我只需要 s 时,浏览所有这些视图太长了UILabel

我试图避免这样的事情:

for (UIView *view in myView.subviews) 
{
    if([view isKindOfClass:[UILabel class]])
    {
        UILabel *lbl = (UILabel*)view;
    }
}

有可能还是我在做梦?

4

4 回答 4

6

创建一个NSArrayivar,您可以将所有UILabel' 添加到其中。

如果您在代码中执行此操作,那么当您创建UILabel只是做

NSMutableArray *labels = [[NSMutableArray alloc] init];

// Repeat this for al labels
UILabel *label = [[UILabel alloc] in...
[labels addObject:label];

// Then
self.labels = [labels copy];

如果您使用 IB,请像这样声明您的财产

@property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *labels;

并将所有标签连接到此。

于 2012-04-12T17:01:11.243 回答
4

伙计,你需要使用递归。(如果你不想使用标签)

试试这个。

-(UIView *)checkChild:(UIView *)view{

    NSArray *arrayView = view.subviews;
    UIView *returnView = nil;

    for (UIView *auxView in arrayView) {
        if ([auxView isKindOfClass:[UILabel class]]) {
            return auxView;
        }else{
            returnView = [self checkChild:auxView];
        }
    }
    return returnView;
}
于 2014-01-15T22:33:15.887 回答
2

我喜欢@SiddharthaMoraes 的方法,但将其更改为收集在其路径上找到的所有元素。我一直在寻找UILabelsmy 的内部UIViewController,但找不到它们,因为它们嵌套在 anotherUIView中,所以这种递归应该可以解决问题:

-(NSMutableArray *)checkChild:(UIView *)view{

    NSArray *arrayView = view.subviews;
    NSMutableArray *arrayToReturn = [NSMutableArray new];

    for (UIView *auxView in arrayView) {
        if ([auxView isKindOfClass:[MyLabel class]]) {
            [arrayToReturn addObject:auxView];
        }else if( auxView.subviews ){
            [arrayToReturn addObjectsFromArray:[self checkChild:auxView]];
        }
    }
    return arrayToReturn;
}
于 2015-05-16T21:52:15.993 回答
1

您可以为标签设置标签属性..像这样......

label.tag = 100;

UILabel *lbl = [yourView viewWithTag:100];
于 2012-04-12T16:56:05.797 回答