2018-02-09如何处理textView与textfield的代理与通知方法与bug解决

最近我写的代码出了bug,后来接手的同事很是不解,一个把textView的长度限制在200字以内的功能,怎么可以写的这么复杂呢?

假定我们处理textView的方法
代理的方法,我们定义为shouldChange方法
通知对应的自定义的方法:textDidChange方法

通过代码修改textView中的text的长度 这个代码应该写在上面哪个方法中呢?

我的方法

我写在shouldChange方法里面,就必须return NO,并告知系统,我自己改了字符串,你就不要执行系统默认的替代方法了。然后这样做的后果是:
系统认为我不需要帮你进行替换了,那我就认为字符串没变,就不会对外发出textView的内容改变的通知,第二个方法就不会执行。这时候你想在第二个方法做一些别操作都无效了。

同事的做法

把所有修改textView内文本内容的方法,卸载第二个通知的方法里。
第一个方法里面只是监听换行符,当用户点击完成时,释放键盘弹窗,其余情况都返回yes
这个方法好处在于:通知的方法一定会执行。

其实这两个方法都各有千秋:
第一个方法比较提前,比较细节,如果我们处理的字符串是在输入到文本框之前,我建议把这些操作放在第一个的代理方法中进行处理。

第二个方法在系统替换的方法之后,如果我们处理的字符串是在系统处理完字符串(复制,出入,拼接、粘贴等)之后,我们可以操作放在第二个方法里,但是第一个方法务必返回yes。

而处理字符串长度的问题,放在第二个方法里明显比放在第一个方法里面好。

如果遇到这种需求名字长度仅仅限制到四个字,你还放在方法二中,如果你拼音输入法输入张三,你会发现你只能输入zhan 就什么不能输入了。这种需求放在方法一中去实现是最好的了。(实现方法:方法一中在拼接前,对初始字符串的长度进行限制即可,期间你输入的用来拼接字符的长度不带任何限制即可)

PS: 备注一下:凡是通过代码修改textView的text内容,所有代理与通知的方法都能不会触发。(这句话也许你觉得是废话,可是有一个人觉的有意义,那就可以了)

你可能感兴趣的:(2018-02-09如何处理textView与textfield的代理与通知方法与bug解决)