使用字符串来表示UIView的tag值

本文介绍了一种使用字符串代替数字作为UIView tag值的方法,通过创建UIView的类别`UIView+Tag`,使得tag更具可读性。在视图控制器中,通过字符串标识可以更方便地管理和查找视图,但需要注意避免在不同方法中使用相同名称的视图,以免造成混淆。

首先声明这个方法非我原创!

这是一个同学想出来的

下面我们来说一下具体实现,使用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值的不同理解

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值