美文网首页
iOS中关于UITextField和UITextView的Bug

iOS中关于UITextField和UITextView的Bug

作者: 刘庚生 | 来源:发表于2016-02-17 23:45 被阅读1249次

    根据以上截图键盘所示,选择键盘推荐的汉字,将不能触发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; 并在代理里实现如图操作就行了。

    相关文章

      网友评论

          本文标题:iOS中关于UITextField和UITextView的Bug

          本文链接:https://www.haomeiwen.com/subject/knsmkttx.html