iOS中关于UITextField和UITextView的Bug

iOS中关于UITextField和UITextView的Bug_第1张图片

根据以上截图键盘所示,选择键盘推荐的汉字,将不能触发UITextField和UITextView的代理方法:

-(BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string{}

-(BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text{}

由此将不能正确限制用户输入的字数,解决方案如下:

UITextField:

[_textFieldaddTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

以上代码表示对_textFiled添加UIControlEventEditingChanged事件,当_textField的文本发生改变时,就会触发自定义的textFieldDidChange方法;在textFieldDidChange方法中对_textFiled进行字数的限制。

UITextView:

由于UITextField继承于UIControl,所以有addTarget这个方法;但UITextView继承于UIScrollView,无法实现类似UITextField的addTarget方法;

我突发奇想,如果用KVO来解决此问题呢?如下代码:

[_signatureTextView addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];//添加监听

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{};//实现监听事件

但!并不是这样!这里忽略了一点:KVO是键值监听,其中‘值’是属性(且是对象);当用户通过键盘输入文字来改变textView的text,并非通过set方法为text赋值,也就不会触发监听事件!

那怎么解决呢?如果通过自定义UITextField来解决该问题,那么只是解决了功能性问题;并未解决UITextView自身的问题。目前我还未想到理想的解决办法。

解决办法如下:

iOS中关于UITextField和UITextView的Bug_第2张图片
方法截图

说明:方案很简单;只需实现 TextView 的代理 -(void)textViewDidChange:(UITextView *)textView; 并在代理里实现如图操作就行了。

你可能感兴趣的:(iOS中关于UITextField和UITextView的Bug)