2.猜测可能是个label,在小面包里看,打断点UITextField *text查看属性,搜索label,找到_placehoderLabel,使用KVC找到,设置颜色
3.
使用分类设置一个属性,实现它的set方法,调用这个set方法就可以设置颜色,将2中的代码写在set方法里。
使用这个分类有一个BUG,如果这样写
self.testText.placeColor = [UIColor greenColor];
self.testText.placeholder = @"234";
这个方法就不能成功。
必须先能够获取到系统的label在设置颜色才能够成功,如果先设置颜色后给系统label设置属性间接获取label,这个方法就不能成功。
思路:需要给系统添加一个属性,然后调用系统的属性走自己的方法
当我们想如果能够给系统添加一个属性,在分类中使用runtime。
还需要利用runtime去交换系统和我们自定义的方法
关键代码:
#import "UITextField+LSPlaceHoderColor.h"
#import <objc/message.h>
@implementation UITextField (LSPlaceHoderColor)
+ (void)load{
Method method1 = class_getInstanceMethod(self, @selector(setPlaceholder:));
Method method2 = class_getInstanceMethod(self, @selector(setLS_Placeholder:));
method_exchangeImplementations(method1, method2);
}
- (void)setPlaceColor:(UIColor *)placeColor{
objc_setAssociatedObject(self, @"placeholderColor", placeColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
UILabel *placeholderLabel = [self valueForKey:@"_placeholderLabel"];
placeholderLabel.textColor = placeColor;
}
//不获取颜色,所以返回nil
//- (UIColor *)placeColor{
// return nil;
//}
//这时候不能返回nil了,要返回runtime添加的属性这样self.placeColor = self.placeColor;中的get方法才能调用到
- (UIColor *)placeColor{
return objc_getAssociatedObject(self, @"placeholderColor");
}
- (void)setLS_Placeholder:(NSString *)lsplaceholder{
//调用自己的就是调用系统的
[self setLS_Placeholder:lsplaceholder];
// self.placeholder = lsplaceholder;
self.placeColor = self.placeColor;
}
@end