关于View Tag值的不同理解

在iOS开发中,设置View的Tag值来标识和查找视图存在弊端,因为需要记住每个视图对应的整型值。本文提出了一种改进方法,通过创建一个NSMutableArray单例,为视图分配名字并存储在数组中,用名字在数组中的下标作为tag值。这样,通过名字就能获取到对应的视图。作者编写了AMViewTagManager类,并提供了UIView的类目方便使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编写界面时,总会要添加各种各样的视图(包括其子类,下同)到self.view上,而这些视图大多数都是在某个方法中初始化的,如果想要在其他方法中获取某个子视图,通常有三种方法:声明为属性、全局变量、设置其tag值,前两种在此就不再多说,我只想说说设置tag值的这种方法,在使用的时候就发现了其弊端:tag值只是一个NSInteger值,而这种将视图与整形数字建立起的关系就很抽象,你必须记得每一个view所对应的整型值,所以我就有了想要“改变”它的想法:如何让view、tag、name产生关联?


整体思路是这样的:

创建一个NSMutableArray单例,给需要设置tag值的view起个名字(通常是view对象的名称),将这个字符串的名字添加到数组单例中,再将这个名字在数组中的下标(整型值)设置给view.tag,当需要获取view时,通过名字,获取他在数组中的下标,即"tag"值,即可得到对应的view.

按照这个思路,我编写了AMViewTagManager类,添加完UIView的类目后,在使用起来就是下面这个样子~

#import "RootViewController.h"
#import "UIView+AMViewTagManager.h"

@implementation RootViewController


- (void)viewDidLoad {
    [super viewDidLoad];

	UITextField * textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 50, 300, 50)];
	textField.text = @"1";
	textField.font = [UIFont systemFontOfSize:30];
	textField.enabled = NO;
	textField.borderStyle = UITextBorderStyleRoundedRect;
	[textField setTagWithName:@"textField"];       // 通过name设置tag值
	[self.view addSubview:textField];
	
	UIButton * button = [UIButton buttonWithType:UIButtonTypeSystem];
	button.frame = CGRectMake(10, 150, 300, 30);
	[button setTitle:@"2倍" forState:UIControlStateNormal];
	[button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
	button.layer.masksToBounds = YES;
	button.layer.cornerRadius = 5;
	button.layer.borderWidth = 1;
	button.layer.borderColor = [UIColor lightGrayColor].CGColor;
	[button addTarget:self action:@selector(addNumber:) forControlEvents:UIControlEventTouchUpInside];
	[self.view addSubview:button];
}

- (void)addNumber:(UIButton *)sender {
	UITextField * textField = (UITextField *)[self.view viewWithName:@"textField"];        // 通过name获取view
	textField.text = [NSString stringWithFormat:@"%d", [textField.text intValue] * 2];
}


@end

下面是UIView+AMViewTagManager.h的内容

//
//  UIView+AMTagManager.h
//  AMToolkitLab_3.0
//
//  Created by Andy on 14-11-5.
//  Copyright (c) 2014年 Andy__M. All rights reserved.
//

#import <UIKit/UIKit.h>

/** @brief 视图Tag管理类:添加需要设置tag的veiw和描述字符串name,便可随时通过name获取其对应的tag值 */
@interface AMViewTagManager : NSObject

/** @brief 返回视图Tag管理对象 */
+ (AMViewTagManager *)defaultManager;

/** @brief 返回视图Tag管理数组 */
+ (NSArray *)arrayOfTagNames;

/** @brief 打印视图tag值管理数组的内容 */
+ (void)printTagsAndNames;

@end





@interface UIView (AMViewTagManager)

/** @brief 设置视图的tag值,并有特定的name与其对应 */
- (void)setTagWithName:(NSString *)name;

/** @brief 返回指定tag值的视图 */
- (UIView *)viewWithName:(NSString *)name;

@end

下面是UIView+AMViewTagManager.m的内容

//
//  UIView+AMTagManager.m
//  AMToolkitLab_3.0
//
//  Created by Andy on 14-11-5.
//  Copyright (c) 2014年 Andy__M. All rights reserved.
//

#import "UIView+AMViewTagManager.h"

#define ViewTagOffest 5000		//	tag偏移值

@interface AMViewTagManager ()
/**
 *  视图名称数组
 */
@property(nonatomic, retain) NSMutableArray * tagNameArray;
@end

@implementation AMViewTagManager

+ (AMViewTagManager *)defaultManager {
	static AMViewTagManager * viewTagManager = nil;
    static dispatch_once_t  onceToken;
    dispatch_once(&onceToken, ^{
        viewTagManager = [[AMViewTagManager alloc] init];
		viewTagManager.tagNameArray = [[NSMutableArray alloc] initWithCapacity:1];
    });
    return viewTagManager;
}

+ (NSArray *)arrayOfTagNames {
	return [AMViewTagManager defaultManager].tagNameArray;
}


+ (void)printTagsAndNames {
	NSMutableArray * tagNameArray = [AMViewTagManager defaultManager].tagNameArray;
	NSMutableString * des = [NSMutableString stringWithString:@"AMViewTagManager {\n"];
	for (int i = 0; i < tagNameArray.count; i ++) {
		[des appendFormat:@"%d : %@\n", i+ViewTagOffest, [tagNameArray objectAtIndex:i]];
	}
	[des appendString:@"}"];
	NSLog(@"%@", des);
}

@end





@implementation UIView (AMTagManager)

- (void)setTagWithName:(NSString *)name {
	NSMutableArray * tagNameArray = [AMViewTagManager defaultManager].tagNameArray;
	if (![tagNameArray containsObject:name]) {
		[tagNameArray addObject:name];
	}
	self.tag = [tagNameArray indexOfObject:name] + ViewTagOffest;
}

- (UIView *)viewWithName:(NSString *)name {
	NSMutableArray * tagNameArray = [AMViewTagManager defaultManager].tagNameArray;
	int tag = [tagNameArray indexOfObject:name] + ViewTagOffest;
	return [self viewWithTag:tag];
}

@end





Demo地址:http://pan.baidu.com/s/1kTrBdd1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值