2012-04-12 40 views
7

我需要一種方法來獲取所有UILabel s在UIView之內,而不必通過UIView中的所有視圖。如何獲取UIView中的所有UILabels

我有很多其他類型的意見,UIButton s,UIImageView s,當我只需要UILabel s時,它會太長時間通過所有這些意見。

我試圖避免這樣的事情:

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

是否有可能還是我在做夢?

+0

你如何創建它們 - 在Interface Builder或代碼? – 2012-04-12 16:55:42

回答

5

創建NSArray伊娃,你可以將所有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; 

和所有標籤最多可連接到這。

+0

不是我在找的東西,而是迄今爲止最好的答案。 – subharb 2012-04-19 16:09:20

1

您可以設置標籤屬性標籤..這樣的事情...

label.tag = 100; 

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

Yuk不使用'viewWithTag:'有更好的方法 – 2012-04-12 16:57:47

+0

@ Paul.s:感謝您的評論..我可以知道使用viewWithTag的缺點是什麼? – Aravindhan 2012-04-12 17:02:58

+1

僅供參考我打算投反對票,但是我認爲這會有點苛刻,因爲我看到這個建議很多。這只是一個有趣的/懶惰的 - 如果你需要一個視圖的引用,並且你知道你需要它,那麼爲什麼不把它變成一個伊娃?我不喜歡通過潛在的大視圖層次結構來查詢每個標記的意圖,以便可以意外更改任意值。同樣在這種情況下,OP想要返回多個視圖,而這個API不會這樣做。 – 2012-04-12 17:08:49

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

不錯的片段,你應該返回一個在你的路徑上找到的元素數組,而不是返回一個元素。您還將只從您正在查找的類的子視圖中獲取最後一個元素,因爲您總是用新值覆蓋最後一個元素。 – 2015-05-16 21:55:08

1

我喜歡@SiddharthaMoraes的方法,但改變了它收集所有的路徑上找到的元素。我一直在尋找我的UIViewControllerUILabels,無法找到他們,因爲他們在那裏嵌套在另一個UIView,所以這個遞歸應該解決的問題:

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