首先声明这个方法非我原创!
这是一个同学想出来的
下面我们来说一下具体实现,使用tag值时,因为是一个毫无意义的数字,使用起来不免麻烦;加入我们使用字符串来设置tag值,例如:aLabel的tag值为“aLabel”,我们定义视图的时候,肯定不会定义相同名字的,那么这样是不是就更便于记了呢。
下面就来具体说说怎么实现吧,
首先我们要为UIView设置类目: " UIView+Tag "
UIView+Tag.h :
#import <UIKit/UIKit.h>
@interface UIView (Tag)
- (void)setTagWithName:(NSString *)name;
- (UIView *)viewWithTagName:(NSString *)name;
@end
UIView+Tag.m :
#import "UIView+Tag.h"
@implementation UIView (Tag)
/**
* tag值得偏移
*/
static int tagOffSet = 1000;
/**
* 数组单例,存储所有的字符串tag值
*
* @return 存储tag值得数组
*/
- (NSMutableArray *)getTagNameArray
{
static NSMutableArray * tagNameArray = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
tagNameArray = [[NSMutableArray alloc] initWithCapacity:1];
});
return tagNameArray;
};
/**
* 为视图设置字符串tag值
*
* @param name 字符串tag值
*/
- (void)setTagWithName:(NSString *)name
{
NSMutableArray * tagNameArray = [self getTagNameArray]; //获取存放tag值得单例数组
if (![tagNameArray containsObject:name]) {
[tagNameArray addObject:name]; //将字符串tag值添加进数组
}
self.tag = ([tagNameArray indexOfObject:name] + 1) *tagOffSet; //设置数值tag值得偏移
}
/**
* 通过字符串tag值,获取对应的视图
*
* @param name 字符串tag值
*
* @return 字符串tag值对应的视图
*/
- (UIView *)viewWithTagName:(NSString *)name
{
NSMutableArray * tagNameArray = [self getTagNameArray];
if (tagNameArray.count == 0) {
return nil; //为了防止没有添加字符串tag值到数组中,引起崩溃
}
int tag = ([tagNameArray indexOfObject:name] + 1) *tagOffSet; //通过获取到字符串tag值所在数组的的位置,而获取的存储的数值tag值
return [self viewWithTag:tag]; //返回数值tag值所对应的视图
}
@end
由此我们可以看到虽然是用字符串存储的tag值,但是内部我们还是使用的整型数字,我们只是对他进行一个转换,下面我们来试试能不能用吧
我们创建一个视图控制器,在viewDidLoad中:
- (void)viewDidLoad
{
[super viewDidLoad];
UILabel * aLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
aLabel.text = @"aa";
[aLabel setTagWithName:@"aLabel"];
[self.view addSubview:aLabel];
[aLabel release];
NSLog(@"aLabel:%p,%@",aLabel,aLabel.text); //打印aLabel的地址和aLabel.text内容
[self test];
}
创建一个text方法:
- (void)test
{
UILabel * label = (UILabel *)[self.view viewWithTagName:@"aLabel"]; //这里我只是声明一个label,使用字符串tag值进行获取,因为返回值是UIView类型,所以需要使用UILabel来强转,并没有设置label的任何属性
NSLog(@"label :%p,%@",label,label.text); //打印label的地址和label.text内容
}下面我们看一下打印结果
注意:当你需要在不同的方法中定义视图对象时,名字也不可以相同,因为虽然数组中可以存储相同的字符串,我们在取视图时是根据字符串在数组中下标来取,所以如果数组中存在相同的字符串,在取得时候会造成混淆,取出来的不一定是你想要的
两个label的地址是一样的,因为我们内部还是使用的系统的tag值,只不过给他包装了一层方便使用,会用了么。
这是一个同学想出来的方法,一直只是脑子里想,今天手动实现了一把。。
同学写的文章地址:关于View Tag值的不同理解。
本文介绍了一种使用字符串代替数字作为UIView tag值的方法,通过创建UIView的类别`UIView+Tag`,使得tag更具可读性。在视图控制器中,通过字符串标识可以更方便地管理和查找视图,但需要注意避免在不同方法中使用相同名称的视图,以免造成混淆。
2万+

被折叠的 条评论
为什么被折叠?



