2012-04-12 27 views
7

Tôi cần một cách để có được tất cả UILabel s trong một UIView mà không cần phải đi qua tất cả các chế độ xem trong số UIView.cách nhận tất cả UILabels trong một UIView

Tôi có nhiều loại chế độ xem khác, UIButton s, UIImageView và sẽ mất quá nhiều thời gian để xem tất cả khi tôi chỉ cần UILabel giây.

Tôi đang cố gắng để tránh một cái gì đó như thế này:

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

Có thể hay tôi mơ ước?

+0

Làm thế nào để bạn tạo ra chúng - trong Interface Builder hoặc trong mã? –

Trả lời

5

Tạo một NSArray Ivar mà bạn có thể thêm tất cả các UILabel 's.

Nếu bạn làm điều đó trong mã sau đó khi bạn tạo ra các UILabel chỉ làm

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

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

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

Nếu bạn sử dụng IB sự kê khai tài sản của bạn như thế này

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

và kết nối tất cả các nhãn lên đến này .

+0

Không phải những gì tôi đang tìm kiếm, nhưng câu trả lời tốt nhất cho đến nay. – subharb

1

Bạn có thể thiết lập thuộc tính tag cho nhãn .. một cái gì đó như thế này ...

label.tag = 100; 

UILabel *lbl = [yourView viewWithTag:100]; 
+0

Yuk không sử dụng 'viewWithTag:' có nhiều cách tốt hơn –

+0

@ Paul.s: cảm ơn bạn đã bình luận .. Tôi có thể biết nhược điểm của việc sử dụng viewWithTag là gì? – Aravindhan

+1

FYI Tôi đã đi xuống bỏ phiếu, nhưng tôi quyết định nó sẽ là một chút khắc nghiệt như tôi thấy đề xuất này rất nhiều. Nó chỉ là một chút naff/lười biếng - nếu bạn cần một tham chiếu đến một cái nhìn và bạn biết bạn cần nó, thì tại sao không làm cho một ivar ra khỏi nó? Tôi không thích ý tưởng rà soát thông qua một hệ thống phân cấp có khả năng xem lớn yêu cầu mỗi thẻ cho một giá trị tùy ý có thể vô tình bị thay đổi. Cũng trong trường hợp này, OP muốn nhiều lượt xem được trả lại, API này sẽ không làm. –

4

Người đàn ông, bạn cần sử dụng đệ quy. (Nếu bạn không muốn sử dụng thẻ)

Hãy thử tính năng này.

-(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; 
} 
+0

Đoạn mã đẹp, bạn chỉ cần trả lại một mảng các phần tử được tìm thấy trên đường dẫn của bạn thay vì trả về một phần tử đơn lẻ. Bạn cũng sẽ chỉ nhận được phần tử cuối cùng từ các bản xem trước của lớp bạn đang tìm kiếm vì bạn luôn ghi đè phần tử cuối cùng bằng một giá trị mới. –

1

Tôi thích cách tiếp cận của @SiddharthaMoraes, nhưng đã thay đổi nó để thu thập tất cả các yếu tố được tìm thấy trên đường dẫn của nó. Tôi đang tìm kiếm các UILabels bên UIViewController của tôi và không thể tìm thấy họ bởi vì họ nơi lồng vào bên trong UIView khác, vì vậy đệ quy này nên giải quyết vấn đề:

-(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; 
} 
Các vấn đề liên quan