关于viewWithTag的坑

1、superview可以viewWithTag直接访问到subview中对应tag的控件,所以如果要标记一个控件时,同一个superview下的subview,注意不要有存在冲突的相同tag的控件,建议根据view级数来定义,比如superview级的tag用100X,子View用200x,孙view用300x,依次类推

[view1 addsubview:view2]

[view2 addsubview:label]

label.tag=2000;

则[view2  viewWithTag:2000]和[view1 viewWithTag:2000]都能访问到label;

2、如果同一superview下存在相同的tag,会怎么样呢?

如,在上面代码中再加一句:

[view1 addsubview:button],且button.tag=2000,

此时[view1 viewWithTag:2000],得到的仍旧为label,而不是自身下面button;

viewWithTag得到的是最先设置tag为2000的那个控件(包含子view);网上大多说的,都是说优先从自身同等级查找,再找subview,都是想当然,没有经过代码验证的吧。


另外,tag=0为所有view的默认的tag,所以如果我们要标记一个view后面需要用viewWithTag来选取它时,tag的值必须设置大一点(如>1000),据说苹果文档上提到过一次,tag值较小的,如0-100为苹果保留使用, 而0就是保留着给自己这个view使用的。对于其它的view, 如scrollview, 则更上面的0,1,2 都可能会是保留值。

所以不妨定义 #define _initialTag  1000

需要标记的view.tag=_initialTag+iTag;

你可能感兴趣的:(关于viewWithTag的坑)