这里介绍一个可以方便复用的简单方法
runtime 实时机制中有:交换方法和给分类添加属性的功能.
交换方法适用场景:系统自带的方法功能不够,给系统自带的方法扩展一些功能,并且保持原有的功能。
给分类添加属性的功能原理:给一个类声明属性,其实本质就是给这个类添加关联,并不是直接把这个值的内存空间添加到类存空间。
分析:
1.拿不到占位符控件(Placeholder)去设置占位符文字颜色(PlaceholderColor),怎么办?
思路:把设置的占位文字颜色和设置的占位符起来,等调用方法要设置的时候再去设置占位文字的颜色;把这个存放颜色和占位符的属性保存到UITextField(文本框的父类中),这里就需要用到runtime.
2.怎样设置颜色呢?
当系统调用placeholder这个方法的时候实现颜色设置,发现系统的placeholder没有我要设置颜色和占位符的方法,唯有通过自定义写一个placeholder添加placeholderColor属性设置方法再和系统的placeholder方法交换.
代码:
1.写个分类实现添加属性(placeholderColor)和方法交换(这个复用性很好)
<1>程序启动的时候加载
+(void)load
{//需要交换的方法
Method setPlaceholderMethod = class_getInstanceMethod(self,@selector(setPlaceholder:)) ;
//自定义的方法
Method setZJWPlaceholderMethod = class_getInstanceMethod(self,@selector(set_Placeholder:));
//方法交换,我调用系统的 setPlaceholder 方法也相当于调用了set_Placeholder的方法
method_exchangeImplementations(setPlaceholderMethod, setZJWPlaceholderMethod);
}
<2>自定义方法的实现
-(void)seting_Placeholder:(UIColor*)placeholder{
//设置占位符
[selfseting_Placeholder:placeholder];
//设置占位文字颜色
[selfsetPlaceholderColor:self.placeholderColor];
}
<3>设置占位文字颜色
- (void)setPlaceholderColor:(UIColor*)placeholderColor
{
// 把占位文字颜色先保存
objc_setAssociatedObject(self,@"placeholderColor",placeholderColor,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
// 等真正设置占位文字的时候,在去设置占位文字颜色,获取占位文字控件
UILabel*placeholderLabel = [selfvalueForKey:@"placeholderLabel"];
//拿到控件去设置颜色
placeholderLabel.textColor= placeholderColor;
}
<4>返回已添加属性placeholderColor,占位文字颜色
- (UIColor*)placeholderColor
{
returnobjc_getAssociatedObject(self,@"placeholderColor");
}
@end
2.在对应设定UITextField状态的文件中调用方法实现(通过target方式)
-(void)awakeFromNib
{
//设置光标的颜色
self.tintColor= [UIColor blueColor];
//监听文本框开始编辑1.代理,2.target ,3.通知
[self addTarget:self action:@selector(textBegin)forControlEvents:UIControlEventEditingDidBegin];
//结束监听
[self addTarget:self action:@selector(textEnd)forControlEvents:UIControlEventEditingDidEnd];
}
//结束编辑时占位文字的颜色
-(void)textEnd{
self.placeholderColor= [UIColor lightGrayColor];
}
//设置开始编辑时占位文字的颜色
-(void)textBegin{
self.placeholderColor= [UIColor blueColor];
}
@end
以上代码中抽取了分类,也就是说APP 内全局的的UITextField文本都可以设置,有较强的复用性,可移植性.
- (void)setXmg_Placeholder:(NSString*)placeholder
{
//设置占位符控件
[selfsetXmg_Placeholder:placeholder];
//设置占位文字颜色
[selfsetPlaceholderColor:self.placeholderColor];
}
//设置占位文字颜色
- (void)setPlaceholderColor:(UIColor*)placeholderColor
{
// 1.把占位文字颜色先保存
objc_setAssociatedObject(self,@"placeholderColor", placeholderColor,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
// 2.等真正设置占位文字的时候,在去设置占位文字颜色
//获取占位文字控件
UILabel*placeholderLabel = [selfvalueForKey:@"placeholderLabel"];
//拿到控件去设置颜色
placeholderLabel.textColor= placeholderColor;
}
//返回添加属性placeholderColor,占位文字颜色