viewWithTag获取subview规则详解

简介: 获取subview   通常我们在view层级里面对subView的操作可以通过两种方式:1、保留一个subview的引用,然后在类中通过该引用对该subview进行操作,但是要注意在适当的位置添加内存维护的代码,退出前手动释放。

获取subview

  通常我们在view层级里面对subView的操作可以通过两种方式:1、保留一个subview的引用,然后在类中通过该引用对该subview进行操作,但是要注意在适当的位置添加内存维护的代码,退出前手动释放。2、设置subview的Tag,让后在要使用的时候,通过viewWithTag获取到相应的subview,这种方法比较简洁,也不用自己去维护内存。

  ViewWithTag: 通常采用深度遍历优先的算法,返回第一个tag和给定Tag相等的subview。这就导致了一个当一个view的多个subview的tag相同的时候,我们通过该方法得到的view可能并不是自己想要的。

  下面通过一个小例子验证一下,代码如下:

SvTestViewTag.h
//
// SvTestViewTag.h
// SvUIViewSample
//
// Created by maple on 3/18/12.
// Copyright (c) 2012 smileEvday. All rights reserved.
//
// view根据Tag获取subView的时候执行的是深度优先遍历的算法
// 返回第一个Tag和请求tag相等的子View
// 从subViews中查找,最下层的优先找到

#import <UIKit/UIKit.h>

@interface SvTestViewWithTag : UIView

@end
SvTestViewWithTag.m

  例子中代码创建的view的层次图如下:

 

   例子中每个subview都是一个UILabel,而且设置了相应的内容。按钮的响应函数的实现思路:首先隐藏所有类型为UILabel的subview(排除UIButton,因为button需要一直显示),然后根据指定的Tag获取到相应的subview,该subview及其superView的hidden属性为NO。这样就可以保证点击按钮的时候只显示的是第一个tag和指定tag相等的subview。

  为了验证viewWithTag获取subview的原理:

  首先我在subview1中添加了两个tag都为11的subview11和subview12。 运行程序可以,当我们点击"Show Tag 11"按钮的时候屏幕上将显示“SubView11”,而非“SubView12”。同时不管你点击几次该按钮,始终只显示“SubView11”。这样可以看出来同一层级中获取subview时候查找顺序为index从小到大的原则,即位于相对下层的将首先被找到。

  其次我还在subview1中添加了tag均为13的subview13,同时向view中添加了tag也为13的subview2,运行程序点击“Show Tag 13”按钮,屏幕上将会显示“SubView13”,而非“SubView2”。这可以验证viewWithTag在搜索的时候遵循深度优先遍历的原则,即会首先查找最下层的view并递归查询其subview。

  综上两点我们可以看出来viewWithTag获取subview的基本原则,即遵循深度优先,下层优先两个原则。

 

PS:在测试的时候我也发现只要点击过“Show Tag 13”以后,再点击“Show Tag 11”将失去效果,不知道什么原因,但是重启程序就会恢复正常。

  期待你们的答案!

 

 

 

 


  


部门招人: 高级iOS、Android、前端开发,有意私聊,博主请你喝️
如果觉得本文帮到了你,记得点赞哦,当然也可以请博主喝一杯豆浆
微信二维码 QQ二维码
目录
相关文章
|
8月前
|
iOS开发 容器
什么是 UINavigationController 和 UITabBarController?它们有什么作用?
什么是 UINavigationController 和 UITabBarController?它们有什么作用?
52 2
Storyboard\Xib中给UIScrollView的子控件添加约束
Storyboard\Xib中给UIScrollView的子控件添加约束
366 0
Storyboard\Xib中给UIScrollView的子控件添加约束
RecycleView的操作(自定义SnapHelper、ItemDecoration)
RecycleView的操作(自定义SnapHelper、ItemDecoration)
331 0
|
Java Android开发
【RecyclerView】 七、RecyclerView.ItemDecoration 条目装饰 ( getItemOffsets 边距设置 )
【RecyclerView】 七、RecyclerView.ItemDecoration 条目装饰 ( getItemOffsets 边距设置 )
152 0
【RecyclerView】 七、RecyclerView.ItemDecoration 条目装饰 ( getItemOffsets 边距设置 )
|
前端开发 容器
【RecyclerView】 八、RecyclerView.ItemDecoration 条目装饰 ( onDraw 和 onDrawOver 绘制要点 )(一)
【RecyclerView】 八、RecyclerView.ItemDecoration 条目装饰 ( onDraw 和 onDrawOver 绘制要点 )(一)
422 0
【RecyclerView】 八、RecyclerView.ItemDecoration 条目装饰 ( onDraw 和 onDrawOver 绘制要点 )(一)
|
容器
UIView与CALayer的关系
UIView与CALayer的关系
484 0
|
XML Java 开发工具
关于RecycleView的overScrollMode属性的一点探索
这个属性本身没有特别重要的功能,只是针对滑动做的一个动效,算是锦上添花的一个东西吧。 这个属性是在Sdk 21之后添加的,故在21之前的版本上无法显示。
1283 0
自定义QGraphicsItem
简述 QGraphicsItem 是场景中 item 的基类。图形视图提供了一些典型形状的标准 item,例如:矩形 ( QGraphicsRectItem )、椭圆 ( QGraphicsEllipseItem ) 、文本项 ( QGraphicsTextItem )。当这些不满足需求时(例如:在一些复杂的工作流场景中),往往需要自定义,通常的做法就是继承 QGraphi
3294 1
scrollview的原理及一些属性(转)
在滚动过程当中,其实是在修改原点坐标 当手指触摸后, scroll view会暂时拦截触摸事件,使用一个 计时器,假如在计时器到点后,没有发生手指移动事件, 那么,scroll view发送tracking events到被点击的subview 假如在...
1157 0

热门文章

最新文章