因为现在, viewWithTag
实际上搜索本身,然后再全部子视图递归下降的整个子树,与该标记的视图。
但是,如果我设置子视图的标签,100,101,等等,后来,寻找标签100,但这当前视图的父亲集当前视图的100个标签? 然后viewWithTag
将返回当前视图,而不是任何子视图。
同样奇怪的是,如果代码是
[fooView viewWithTag: 123]
为什么代码要搜索的子树,包括fooView本身? 很是喜欢,代码不知道fooView不够好,想寻找它。 或者换一种说法, fooView
被告知要搜索本身...这是奇怪的。 视图不知道自己? (需要做一个搜索,寻找自己?)
那么,有没有一种方法来仅搜索子视图和盛大子视图(不寻找自我)?
充分利用的递归性质-viewWithTag:
- (UIView *)viewWithTagNotCountingSelf:(NSInteger)tag
{
UIView *toReturn = nil;
for (UIView *subView in self.subviews) {
toReturn = [subView viewWithTag:tag];
if (toReturn) {
break;
}
}
return toReturn;
}
编辑:这不是“盛大子视图”进一步深入:它会得到不自层次结构中的任何视图。 另外这是一个类别中实现UIView
。
经过审查文档的-viewWithTag:
和运行一些测试,它似乎是答案OP的问题-已经提供这种行为。
返回值
在接收器的层次结构,其标签属性的视图中,代码参数的值相匹配。
讨论
这种方法搜索指定的视图当前视图及其所有子视图。
我总结这意味着,“查看”也是一个“子视图”,从而限制了搜索的范围。
做这个:
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)
对于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
让结果= view.subviews.filter {$ 0.tag ==标签}。首先