在编写界面时,总会要添加各种各样的视图(包括其子类,下同)到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