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

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

例子中代码创建的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的基本原则,即遵循深度优先,下层优先两个原则。

获取subview的更多相关文章

  1. viewWithTag获取subview规则详解

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

  2. ViewController

    ViewController ViewController 进入VC后先调用loadView,再调用ViewDidLoad ViewDidLoad皆为系统调用 需要先调用[super viewDidL ...

  3. 通过UIView获取UIViewController

    需求很简单,通过UIViewController.view内的任意控件获取当前UIViewController: 立马开写: /** * @brief 通过viewController内的view,获 ...

  4. iOS 获取快递物流信息(GCD异步加载)

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  5. iOS UILabel根据文字获取高度及UITableCell动态获取高度(以截取快递信息为例)

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  6. iOS获取运营商的相关信息

    1.导入:CoreTelephony.framework 2.添加头文件 #import <CoreTelephony/CTTelephonyNetworkInfo.h> #import ...

  7. 有关UIView、subview的几个基础知识点-IOS开发 (实例)

    环境是xcode4.3 首先要弄懂几个基本的概念. 一)三个结构体:CGPoint.CGSize.CGRect 1.  CGPoint /* Points. */ struct CGPoint { C ...

  8. iOS开发之获取WIFI信号强度

    虽然各种直接获取信号强度的api都被封杀了.但是还有一个另类的黑魔法可以获取到.那就是遍历UIStatusBar了 - (void)getSignalStrength{ UIApplication * ...

  9. 在iOS中获取UIView的所有层级结构 相关

    在iOS中获取UIView的所有层级结构 应用场景 在实际 iOS 开发中,很多时候都需要知道某个 UI 控件中包含哪些子控件,并且分清楚它们的层级结构和自个的 frame 以及 bounds ,以便 ...

随机推荐

  1. Codeforces 556A Case of the Zeros and Ones(消除01)

    Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u   Description Andr ...

  2. Linux Makefile多目录的编写

    手头一个项目,需要编写项目的makefile 多目录结构: csource/ ├── common│   └── sqlite3├── inc│   ├── curl│   ├── lua│   └─ ...

  3. spring restful 中文乱码问题

    进行如下配置: @RequestMapping( value="/zzs/xgm", produces="application/json;charset=utf-8&q ...

  4. MVC form post 传值

    http://www.cnblogs.com/firstcsharp/archive/2013/08/05/3238321.html @using (Html.BeginForm())参数示例 MVC ...

  5. Android调用Asp.net Web Service示例

    WebService代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; u ...

  6. SIM卡读卡器的研究与设计

    SIM卡(Subscriber Identity Module).即用户识别模块,是一张符合GSM规范的"智慧卡".SIM卡可以插入任何一部符合GSM规范的移动电话中," ...

  7. rabbitMQ入门

    1 安装 1.1 首先 arbbitmq是用爱尔兰这种语言去编写的,所以,需要这种语言支持,那就需要下载以下几个包去安装来搭建环境 下载并安装erlang,http://www.erlang.org/ ...

  8. POJ1088 滑雪(记忆化搜索)

    题目链接. 分析: 状态转移方程 d[i][j] = max(d[i-1][j], d[i+1][j], d[i][j-1], d[i][j+1]). #include <iostream> ...

  9. 【转】ASCII码表在线查询

    原文网址:http://www.litefeel.com/tools/ascii.php ASCII码对照表 下表列出了字符集中的 0 - 127 (0x00 - 0x7F). 十进制 十六进制 字符 ...

  10. 关于sql server 代理(已禁用代理xp)解决办法

    master数据库下执行 sp_configure 'show advanced options', 1;   GO   RECONFIGURE;   GO   sp_configure 'Agent ...