2012-09-01 39 views
2

因爲現在,viewWithTag實際上首先搜索自己,然後所有的子視圖遞歸地遍歷整個子樹,以獲得具有該標記的視圖。在iOS上,有沒有辦法只搜索某個標籤的子視圖?

但是,如果我將子視圖的標籤設置爲100,101等,然後查找標籤100,但是當前視圖的父級將當前視圖的標籤設置爲100,會怎樣?然後viewWithTag將返回當前視圖,而不是任何子視圖。

同樣奇怪的是,如果代碼是

[fooView viewWithTag: 123] 

爲什麼代碼要搜索的子樹,包括fooView本身?這就像,代碼不知道fooView是否足夠好,也不想搜索它。或者換句話說,fooView被告知要搜索自己......這很奇怪。一個觀點不知道自己? (需要做一個搜索尋找自己?)

那麼有沒有辦法只搜索子視圖和宏觀子視圖(沒有尋找自我)?

回答

7

充分利用的遞歸性-viewWithTag:

- (UIView *)viewWithTagNotCountingSelf:(NSInteger)tag 
{ 
    UIView *toReturn = nil; 

    for (UIView *subView in self.subviews) { 
     toReturn = [subView viewWithTag:tag]; 

     if (toReturn) { 
      break; 
     } 
    } 
    return toReturn; 
} 

編輯的:這將向下鑽取比「盛大子視圖」更遠:它會得到不自層次結構中的任何視圖。這也是要在UIView的類別中實施。

+1

我想知道爲什麼'viewWithTag'的默認行爲不是這樣開始的......我們需要做一些複雜的事情來實現它 –

+0

我不知道爲什麼。我通常不喜歡使用'-viewWithTag:'如果我可以避免它,但也許它的大量用戶可以在這個主題上加入。無論如何,將其添加到一個類別應該是一個簡單的方法來獲得你想要的。 –

+0

例如,我可能會這樣做:在'cellForRowAtIndexPath'中,我將取出一個單元格,如果存在,則只需使用此標記查找現有標籤或之前添加的多個UIImageView,以便更改文本或圖像,而不是將其全部刪除並重新創建新圖像 –

1

對於1級:

UIView *view; 
for (int i = 0; i < viewToSearch.subviews.count; i++){ 
    UIView *subview = viewToSearch.subviews[i]; 
    if (subview.tag == tagToSeach){ 
     view = subview; 
     break; 
    } 
} 

要搜索多層次視圖層次:

__block UIView *view; 
BOOL (^__block searchViewForTag)(UIView *,NSInteger) = ^(UIView *aView, NSInteger tag){ 
    for (UIView *subview in aView.subviews){ 
     if (subview.tag == tag){ 
      view = subview; 
      return YES; 
     } 
     if (searchViewForTag(subview,tag)) return YES; 
    } 
    return NO; 
}; 
NSInteger tagToSearchFor = 1; 
searchViewForTag(viewToSearch,tagToSearchFor); 

//Do something with view 
+0

是第2 ==應該是一個單一= ... – 2012-09-01 05:53:40

+1

這一個只搜索1級了? –

+0

@動靜能量是,view.subviews返回子視圖1級下調 –

1

做這樣的:

NSMutableArray *arrSameViewTag = [NSMutableArray array]; 
for(UIView *subview in [yourView subviews]) //your view to find subview 
{ 
    if(subview.tag == 123) //specific tah here 
    { 
     [arrSameViewTag addObject:subview]; //view found add in array 
    } 
} 
NSlog(@"arrSameViewTag : %@",arrSameViewTag); 

要找到具體的像的UIButton或任何的UIElement然後像這樣:

NSMutableArray *arrSameViewTag = [NSMutableArray array]; 
for(id *subview in [yourView subviews]) //your view to find subview 
{ 
    if([subview isKindofClass[UIButton class]) //any UIElement of specific type here 
    { 
    UIButton *btn = (UIButton *)subview; //same UIElement mentioned for checking it 
    if(btn.tag == 123) //specific tah here 
    { 
     [arrSameViewTag addObject:subview]; //view found add in array 
    } 
    } 
} 
NSlog(@"arrSameViewTag : %@",arrSameViewTag) 
+0

什麼是速度...在8個月4599得分很高... :) – Rajneesh071

2

reviewing the documentation 並且運行一些測試,看來OP的問題的答案是 - 這種行爲已經提供。

返回值

在接收器的層次結構,其標籤屬性的標籤參數 值相匹配的觀點。

討論

該方法搜索所述 指定視圖當前視圖和所有它的子視圖的。

我認爲這意味着'視圖'也是'子視圖',因此限制了搜索範圍。

1

讓利結果= view.subviews.filter {$ 0.tag ==標籤}。首先

相關問題