根据以上截图键盘所示,选择键盘推荐的汉字,将不能触发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<NSString *,id> *)change context:(void *)context{};//实现监听事件
但!并不是这样!这里忽略了一点:KVO是键值监听,其中‘值’是属性(且是对象);当用户通过键盘输入文字来改变textView的text,并非通过set方法为text赋值,也就不会触发监听事件!
那怎么解决呢?如果通过自定义UITextField来解决该问题,那么只是解决了功能性问题;并未解决UITextView自身的问题。目前我还未想到理想的解决办法。
解决办法如下:
说明:方案很简单;只需实现 TextView 的代理
-(void)textViewDidChange:(UITextView *)textView
; 并在代理里实现如图操作就行了。