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

时间:2012-09-01 05:32:03

标签: iphone ios uiview

因为现在,viewWithTag实际上首先搜索自己,然后在整个子树中递归搜索所有子视图,以获得包含该标记的视图。

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

如果代码是

,也很奇怪
[fooView viewWithTag: 123]

为什么代码想要搜索包含fooView本身的子树?就好了,代码不知道fooView足以想要搜索它。换句话说,fooView被告知自己搜索......这很奇怪。一个观点不知道自己? (需要进行搜索以寻找自己吗?)

那么有没有办法只搜索子视图和宏观子视图(不搜索自己)?

5 个答案:

答案 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