
這里介紹一個(gè)可以方便復(fù)用的簡單方法
runtime 實(shí)時(shí)機(jī)制中有:交換方法和給分類添加屬性的功能.
交換方法適用場景:系統(tǒng)自帶的方法功能不夠,給系統(tǒng)自帶的方法擴(kuò)展一些功能,并且保持原有的功能。
給分類添加屬性的功能原理:給一個(gè)類聲明屬性,其實(shí)本質(zhì)就是給這個(gè)類添加關(guān)聯(lián),并不是直接把這個(gè)值的內(nèi)存空間添加到類存空間。
分析:
1.拿不到占位符控件(Placeholder)去設(shè)置占位符文字顏色(PlaceholderColor),怎么辦?
思路:把設(shè)置的占位文字顏色和設(shè)置的占位符起來,等調(diào)用方法要設(shè)置的時(shí)候再去設(shè)置占位文字的顏色;把這個(gè)存放顏色和占位符的屬性保存到UITextField(文本框的父類中),這里就需要用到runtime.
2.怎樣設(shè)置顏色呢?
當(dāng)系統(tǒng)調(diào)用placeholder這個(gè)方法的時(shí)候?qū)崿F(xiàn)顏色設(shè)置,發(fā)現(xiàn)系統(tǒng)的placeholder沒有我要設(shè)置顏色和占位符的方法,唯有通過自定義寫一個(gè)placeholder添加placeholderColor屬性設(shè)置方法再和系統(tǒng)的placeholder方法交換.
代碼:
1.寫個(gè)分類實(shí)現(xiàn)添加屬性(placeholderColor)和方法交換(這個(gè)復(fù)用性很好)
<1>程序啟動(dòng)的時(shí)候加載
+(void)load
{//需要交換的方法
Method setPlaceholderMethod = class_getInstanceMethod(self,@selector(setPlaceholder:)) ;
//自定義的方法
Method setZJWPlaceholderMethod = class_getInstanceMethod(self,@selector(set_Placeholder:));
//方法交換,我調(diào)用系統(tǒng)的 setPlaceholder 方法也相當(dāng)于調(diào)用了set_Placeholder的方法
method_exchangeImplementations(setPlaceholderMethod, setZJWPlaceholderMethod);
}
<2>自定義方法的實(shí)現(xiàn)
-(void)seting_Placeholder:(UIColor*)placeholder{
//設(shè)置占位符
[selfseting_Placeholder:placeholder];
//設(shè)置占位文字顏色
[selfsetPlaceholderColor:self.placeholderColor];
}
<3>設(shè)置占位文字顏色
- (void)setPlaceholderColor:(UIColor*)placeholderColor
{
// 把占位文字顏色先保存
objc_setAssociatedObject(self,@"placeholderColor",placeholderColor,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
// 等真正設(shè)置占位文字的時(shí)候,在去設(shè)置占位文字顏色,獲取占位文字控件
UILabel*placeholderLabel = [selfvalueForKey:@"placeholderLabel"];
//拿到控件去設(shè)置顏色
placeholderLabel.textColor= placeholderColor;
}
<4>返回已添加屬性placeholderColor,占位文字顏色
- (UIColor*)placeholderColor
{
returnobjc_getAssociatedObject(self,@"placeholderColor");
}
@end
2.在對應(yīng)設(shè)定UITextField狀態(tài)的文件中調(diào)用方法實(shí)現(xiàn)(通過target方式)
-(void)awakeFromNib
{
//設(shè)置光標(biāo)的顏色
self.tintColor= [UIColor blueColor];
//監(jiān)聽文本框開始編輯1.代理,2.target ,3.通知
[self addTarget:self action:@selector(textBegin)forControlEvents:UIControlEventEditingDidBegin];
//結(jié)束監(jiān)聽
[self addTarget:self action:@selector(textEnd)forControlEvents:UIControlEventEditingDidEnd];
}
//結(jié)束編輯時(shí)占位文字的顏色
-(void)textEnd{
self.placeholderColor= [UIColor lightGrayColor];
}
//設(shè)置開始編輯時(shí)占位文字的顏色
-(void)textBegin{
self.placeholderColor= [UIColor blueColor];
}
@end
以上代碼中抽取了分類,也就是說APP 內(nèi)全局的的UITextField文本都可以設(shè)置,有較強(qiáng)的復(fù)用性,可移植性.
- (void)setXmg_Placeholder:(NSString*)placeholder
{
//設(shè)置占位符控件
[selfsetXmg_Placeholder:placeholder];
//設(shè)置占位文字顏色
[selfsetPlaceholderColor:self.placeholderColor];
}
//設(shè)置占位文字顏色
- (void)setPlaceholderColor:(UIColor*)placeholderColor
{
// 1.把占位文字顏色先保存
objc_setAssociatedObject(self,@"placeholderColor", placeholderColor,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
// 2.等真正設(shè)置占位文字的時(shí)候,在去設(shè)置占位文字顏色
//獲取占位文字控件
UILabel*placeholderLabel = [selfvalueForKey:@"placeholderLabel"];
//拿到控件去設(shè)置顏色
placeholderLabel.textColor= placeholderColor;
}
//返回添加屬性placeholderColor,占位文字顏色