-
对placeholder的分析
-
随意创建一个UITextFiled, 然后通过打断点的方式, 在调试区查看TextFiled的内部属性(通常用这种方法偷看苹果隐藏起来的属性)
- 通过对属性的排查, 我们发现placeholder本质上就是一个UILabel, 这个隐藏的变量名称为
_placeholderLabel
- 而对于一个UILable, 我们都知道应该怎样修改他的字体颜色, 但是别忘了这个属性是水果隐藏起来的, 私有API, 正常情况下是不会让我们访问到的
- 因此我们就要使用苹果的黑魔法之一: KVC
- 通过对属性的排查, 我们发现placeholder本质上就是一个UILabel, 这个隐藏的变量名称为
-
KVC作为苹果的黑魔法之一, 平时最大的用处就是用来给变量赋值, 并且最nb的地方就在于他能访问到隐藏起来的私有变量: 来重温一下
setValue: forKeyPath:
的实现流程- 首先, 他会根据你所提供的Key, 去方法调用对象的内部, 需找是否有Key对应的setter方法, 如果有就直接调用方法给这个Key附上Value的值
- 如果没有setter方法, 就会查找有没有与Key名称相同的变量, 如果找到了, 就直接给这个变量赋值
- 如果没有找到Key的同名变量, 那么就会继续查找有没有与Key同名, 但是带下划线的成员变量, 即_Key, 如果找到了, 就直接赋值
- 如果此时还是没有找到的话, KVC就会调用
setValue: forUndefinedKey:
这个方法, 然后抛出异常, 程序崩溃 - 这里有一个小技巧, 我们经常使用字典数组给模型赋值, 然后转化为模型数组, 但是从服务器返回的所有数据, 我们并不需要每一个, 往往只是需要其中几个, 而这时使用KVC往往会出现问题, 这时我们可以重写
setValue: forUndefinedKey
这个方法但是不写任何实现, 这样我们就成功的干掉了系统的方法, 不让他再给我们抛出异常, 但强烈建议, 不要随便干掉系统的方法, 除非你知道自己在干什么
-
-
使用KVC来修改placeholder的颜色
-
一行代码搞定placeholder的颜色, 利用KVC来访问他的私有变量
[self setValue:[UIColor lightGrayColor] forKeyPath:@"_placeholderLabel.textColor"];
-
如果你想在UITextFiled编辑时, 编辑完成时展现不同的颜色, 就需要给TextFiled添加监听方法
-
UITextFiled属于UIControl的子类, 也就是说他可以使用[]addTarget: action: forControlEvent]这个方法来增加监听方法
-
监听开始编辑: UIControlEventEditingDidBegin
-
监听编辑结束: UIControlEventEditingDidEnd
-
为上面两个监听事件分别绑定不同的方法, 然后再使用KVC更改placeholder的颜色即可
- (void)awakeFromNib { // 默认情况下的颜色 [self setValue:[UIColor lightGrayColor] forKeyPath:@"_placeholderLabel.textColor"]; [self addTarget:self action:@selector(textBeginEdit) forControlEvents:UIControlEventEditingDidBegin]; [self addTarget:self action:@selector(textEndEdit) forControlEvents:UIControlEventEditingDidEnd]; } - (void)textBeginEdit { // 开始编辑时的颜色 [self setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"]; } - (void)textEndEdit { // 结束编辑时的颜色 [self setValue:[UIColor lightGrayColor] forKeyPath:@"_placeholderLabel.textColor"]; }
-
-
网友评论