在iOS上,是有办法具有一定的标签只搜索子视图?(On iOS, is there a way to

2019-06-27 16:12发布

因为现在, viewWithTag实际上搜索本身,然后再全部子视图递归下降的整个子树,与该标记的视图。

但是,如果我设置子视图的标签,100,101,等等,后来,寻找标签100,但这当前视图的父亲集当前视图的100个标签? 然后viewWithTag将返回当前视图,而不是任何子视图。

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

[fooView viewWithTag: 123]

为什么代码要搜索的子树,包括fooView本身? 很是喜欢,代码不知道fooView不够好,想寻找它。 或者换一种说法, fooView被告知要搜索本身...这是奇怪的。 视图不知道自己? (需要做一个搜索,寻找自己?)

那么,有没有一种方法来仅搜索子视图和盛大子视图(不寻找自我)?

Answer 1:

充分利用的递归性质-viewWithTag:

- (UIView *)viewWithTagNotCountingSelf:(NSInteger)tag
{
    UIView *toReturn = nil;

    for (UIView *subView in self.subviews) {
        toReturn = [subView viewWithTag:tag];

        if (toReturn) {
            break;
        }
    }
    return toReturn;
}

编辑:这不是“盛大子视图”进一步深入:它会得到不自层次结构中的任何视图。 另外这是一个类别中实现UIView



Answer 2:

经过审查文档的-viewWithTag:和运行一些测试,它似乎是答案OP的问题-已经提供这种行为。

返回值

在接收器的层次结构,其标签属性的视图中,代码参数的值相匹配。

讨论

这种方法搜索指定的视图当前视图及其所有子视图。

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



Answer 3:

做这个:

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)


Answer 4:

对于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


Answer 5:

让结果= view.subviews.filter {$ 0.tag ==标签}。首先



文章来源: On iOS, is there a way to search ONLY subviews with a certain tag?