需求:一般会要求设置点击开始编辑后占位文字的颜色
理论指导:
1.一旦见到控件上的点击事件,马上想到监听,一见到监听,马上想到让代理对象或者target对象去监听,一见到代理对象,马上想到在非控件类中去设置代理,控件类中是不允许自己设置自己为代理的,如:self.delegate = self 代理产生背景就是由于自己不想做的事情交给别人来做,在自己类中自己监听自己只能用addTarget去做
2.textField上有两个事件,点击开始编辑和点击其他地方结束编辑,addTarget是解决这样的事件最好的方法
3.textField是继承于UIControl,可以用addTarget
解决方法:
1.设置富文本颜色属性
[self addTarget:self action:@selector(editBegin) forControlEvents:UIControlEventEditingDidBegin];
[self addTarget:self action:@selector(editEnd) forControlEvents:UIControlEventEditingDidEnd];
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSForegroundColorAttributeName] = [UIColor lightGrayColor];
self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:attrs];
2.拿到占位文字label,直接设置它的color
由于占位文字label是textField的私有属性,所以正常是拿不到的,只能借助于kvc
根据成员变量名获取到该控件对象
UILabel *placeHolderLabel = [self valueForKey:@"placeHolderLabel"];
placeHolderLabel.textColor = [UIColor whiteColor];
注意:尽管这样使用比较简单,但是我还是倾向于使用第一种方法
封装:
由于testField没有直接提供placeHolderColor属性,而我们为了仿照系统控件其它属性可以这样直接点出来,所以进行一个封装,封装到哪里呢?这就要进行分析,这个属性是不是所有的textField控件都要使用,如果都要使用,那么封装到分类中
1.先在.h中声明属性,分类中的属性不会形成set和get实现,只会生成声明
@property UIColor *placeHolderColor;
2.在.m中实现set和get方法
-(void)setPlaceHolderColor:(UIColor *)placeHolderColor
{
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSForegroundColorAttributeName] = placeHolderColor;
self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:attrs];
}
-(UIColor *)placeHolderColor
{
return nil;
}