在iOS上,有没有办法只search某个标签的子视图?
因为现在, viewWithTag
实际上首先search自己,然后所有子视图recursion地向下viewWithTag
整个子树,以获得具有该标记的视图。
但是,如果我将子视图的标签设置为100,101等,并且稍后查找标签100,但是当前视图的父级将当前视图的标签设置为100? 然后, viewWithTag
将返回当前视图,而不是任何子视图。
这也是奇怪的,如果代码是
[fooView viewWithTag: 123]
为什么代码要search子树,包括fooView本身? 这就像,代码不知道fooView也不够好,也想要search它。 换句话说, fooView
被告知要search自己……这很奇怪。 一个观点不知道自己? (需要做一个search来寻找自己?)
那么是否有办法只search子视图和macros观子视图(不search自己)?
利用-viewWithTag:
的recursion性质-viewWithTag:
- (UIView *)viewWithTagNotCountingSelf:(NSInteger)tag { UIView *toReturn = nil; for (UIView *subView in self.subviews) { toReturn = [subView viewWithTag:tag]; if (toReturn) { break; } } return toReturn; }
编辑:这将比“grand-subviews”更深入:它会得到任何不是自我的层次结构的视图。 这也是在UIView
的类别中实现的。
在检查了 -viewWithTag:
的文档之后,运行一些testing,看来OP的问题的答案是 – 这个行为已经提供了。
返回值
接收方层次结构中的标签属性与标签参数中的值匹配的视图。
讨论
此方法search当前视图及其所有子视图以获取指定的视图。
我认为这意味着“视图”也是一个“子视图”,因此限制了search的范围。
做这个:
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);
要find特定的像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; } }
要search具有多个级别的视图层次结构:
__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
let result = view.subviews.filter {$ 0.tag == tag} .first
- addChildViewController给NSException错误?
- Swift:没有人会打扰的常见错误-可选的强制解包,vars和强制转换
- 在UITextView上点击时,UICollectionView didSelectItemAtIndexPath未被调用
- 这个价值应该被释放吗?
- 如何从苹果崩溃报告中find内存位置? 从我的应用程序崩溃的地方?
- 通过单击表视图中的单元格打开新的视图控制器 – Swift iOS
- 在swift中重写属性
- 你能否在UIWebView中拦截NSURLRequests而不会破坏后退按钮?
- UIImagePickerController EXC_BAD_ACCESS错误