在iOS上,有没有办法只search某个标签的子视图?

因为现在, viewWithTag实际上首先search自己,然后所有子视图recursion地向下viewWithTag整个子树,以获得具有该标记的视图。

但是,如果我将子视图的标签设置为100,101等,并且稍后查找标签100,但是当前视图的父级将当前视图的标签设置为100? 然后, viewWithTag将返回当前视图,而不是任何子视图。

这也是奇怪的,如果代码是

 [fooView viewWithTag: 123] 

为什么代码要search子树,包括fooView本身? 这就像,代码不知道fooView也不够好,也想要search它。 换句话说, fooView被告知要search自己……这很奇怪。 一个观点不知道自己? (需要做一个search来寻找自己?)

那么是否有办法只search子视图和macros观子视图(不search自己)?

利用-viewWithTag:的recursion性质-viewWithTag:

 - (UIView *)viewWithTagNotCountingSelf:(NSInteger)tag { UIView *toReturn = nil; for (UIView *subView in self.subviews) { toReturn = [subView viewWithTag:tag]; if (toReturn) { break; } } return toReturn; } 

编辑:这将比“grand-subviews”更深入:它会得到任何不是自我的层次结构的视图。 这也是在UIView的类别中实现的。

在检查了 -viewWithTag: 的文档之后,运行一些testing,看来OP的问题的答案是 – 这个行为已经提供了。

返回值

接收方层次结构中的标签属性与标签参数中的值匹配的视图。

讨论

此方法search当前视图及其所有子视图以获取指定的视图。

我认为这意味着“视图”也是一个“子视图”,因此限制了search的范围。

做这个:

 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); 

要find特定的像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) 

1级:

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

要search具有多个级别的视图层次结构:

 __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 

let result = view.subviews.filter {$ 0.tag == tag} .first