zoukankan      html  css  js  c++  java
  • viewWithTag获取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”将失去效果,不知道什么原因,但是重启程序就会恢复正常。

      期待你们的答案!


      

  • 相关阅读:
    钉钉服务器端SDK PHP版
    戒不掉
    亲历钓鱼网站
    我整理的PHP 7.0主要新特性
    JavaScript中JSON的处理心得
    X3D中Profile如何翻译
    你可以写什么?
    Gitblit中采用Ticket模式进行协作开发
    理解JavaScript中的事件处理 阻止冒泡event.stopPropagation();
    测试Remoting三种信道Http,Tcp,Ipc和Web Service的访问速度 (转)
  • 原文地址:https://www.cnblogs.com/smileEvday/p/2410529.html
Copyright © 2011-2022 走看看