首页 > 代码库 > 自定义文本框占位颜色和runtime

自定义文本框占位颜色和runtime

请耐心看完这篇文章,你会发现惊喜。当我看到这个需求的时候,首先脑海里就有个思路,既然和系统给的不一样,那肯定就要自定义了,最开始我并不知道怎么改,所以我点进去,UITextField类里面,既然是占位颜色,所以我就搜索place,就发现了

技术分享

这两个属性,想都不用想,肯定我们对第二个属性进行操作,在这里牵扯到了小逻辑的处理,就是要监听开始编辑和结束编辑的状态,用什么监听呢?

开发中监听事件用到三种:1.代理 2.通知 3.target  

用代理?代理中有一个原则:永远不要自己成为自己的代理,我们在自定义的textField中设置代理这不搞笑呢,通知?跨多界面传值一般才用,所以这里用 target最合适

技术分享

功能实现了,可是呢,作为开发人员,改个颜色写这么多代码有些不恰当吧,所以又想到了什么?是不是想到了给自定义的类添加一个placeholder的属性,给类添加属性,不错就是分类了。

技术分享

分类中是有set和get方法的,只是没实现没有有带下划线的属性而已,写好以后,直接在自定义的类里面直接就

 

   self.lsPlacehoder = self.placeholder;

这样可否简单多了,但是还是有点遗憾,这样很不直观,不太能够读懂我们最希望的就是直接self.placeholder = [UIColor WhiteColor]这样是不是就简单粗暴了,

所以继续观察,占位文字猜测应该是一个label,我们使用

技术分享

观察

技术分享

这就是我们想要的控件UITextFieldLabel,所以我们确定了我们需要一个label的属性,点击进去看发现,苹果官方只是声明了一下,并没有给我们详细说明里面的属性,猜测是隐藏的私有属性,所以如何获得label的属性呢,这里用比较简单的方式打断点,runtime也能获得属性,但是太麻烦,而且什么都不知道的情况下不利于锁定,怎么简单怎么来

技术分享

现在知道设置占位属性真正的label,是_placeholderLabel,所以获取这个label得用KVC

 

UILabel *placehoderlabel = [self valueForKey:@"placeholderLabel"];

    placehoderlabel.textColor = [UIColor lightGrayColor];

一点问题没有,这时候哈哈哈,可以在分类里写,外界可以直接设置颜色了

分类中

技术分享

自定义textField类中

技术分享

这样就可以了,但是呢小伙伴可以测试一下,这样写是有BUG的,经过测试发现我们只有先设置占位文字,后设置占位颜色才可以,调换顺序后是不行的,查询了一些解决方法,发现因为OC中控件都是懒加载,我们要想完美的解决这个问题,必须事先将占位颜色保存起来,等到用到的时候再去调用,想到这,给系统添加属性和方法第一个反应就是runtime运行时

做一个小测试

技术分享

 

这样调用lsPlacehoder就可以实现设置文字和颜色无序了,可是这样调用不是我们的终极目标,我们希望直接调用placeholder直接设置,所以用runtime交换两个方法,

技术分享

哈哈完美这样的话,我们不管怎么设置文字或者颜色,都可以设置上啦。

自定义文本框占位颜色和runtime