因为现在,viewWithTag
实际上首先搜索自己,然后在整个子树中递归搜索所有子视图,以获得包含该标记的视图。
但是,如果我将子视图的标签设置为100,101等,然后再查找标签100,但是当前视图的父级将当前视图的标签设置为100?然后viewWithTag
将返回当前视图,而不是任何子视图。
如果代码是
,也很奇怪[fooView viewWithTag: 123]
为什么代码想要搜索包含fooView本身的子树?就好了,代码不知道fooView足以想要搜索它。换句话说,fooView
被告知自己搜索......这很奇怪。一个观点不知道自己? (需要进行搜索以寻找自己吗?)
那么有没有办法只搜索子视图和宏观子视图(不搜索自己)?
答案 0 :(得分: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 :(得分:2)
-viewWithTag:
{{1}}并运行一些测试后,OP问题的答案似乎是 - 已经提供了此行为。
返回值
接收者层次结构中与tag属性匹配的视图 tag参数中的值。
讨论
此方法搜索当前视图及其所有子视图 指定的视图。
我的结论是“视图”也是一个“子视图”,因此限制了搜索的范围。
答案 2 :(得分: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
答案 3 :(得分: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)
答案 4 :(得分:1)
让result = view.subviews.filter {$ 0.tag == tag} .first