3

因为现在,viewWithTag实际上首先搜索自身,然后所有子视图递归地沿着整个子树搜索具有该标签的视图。

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

同样奇怪的是,如果代码是

[fooView viewWithTag: 123]

为什么代码要搜索包括 fooView 本身的子树?就像,代码不知道 fooView 足够好,也不想搜索它。或者换一种说法,fooView被告知要搜索自己……这很奇怪。视图不知道自己?(需要搜索自己吗?)

那么有没有办法只搜索子视图和大子视图(不搜索自我)?

4

5 回答 5

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.

于 2012-09-01T05:43:28.630 回答
2

在查看文档-viewWithTag:并运行一些测试之后,OP 问题的答案似乎是 - 已经提供了这种行为。

返回值

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

讨论

此方法在当前视图及其所有子视图中搜索指定视图。

我的结论是这意味着“视图”也是一个“子视图”,从而限制了搜索的范围。

于 2014-09-08T14:20:47.887 回答
2

让结果 = view.subviews.filter{$0.tag == tag}.first

于 2017-11-29T01:13:23.110 回答
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
于 2012-09-01T05:37:51.710 回答
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)
于 2012-09-01T05:38:49.340 回答