正确清空UITextView的文字

使用UITextView时,如果实现了它的代理方法去监听文字内容的变化,会实现如下方法。

- (void)textViewDidChange:(UITextView *)textView

但是当代码清空UITextView的文字时,如果使用

- [UITextView setText:]

可以发现文字确实是清空了,但是代理方法却并没有走,查看最新的SDK头文件,发现text属性是copy的,不知道和这个有没有关系。但是细细找找,会发现UITextView实现了iOS里面文字输入的一个协议(我记得之前自己实现过一个输入文本的View,当时用方法里面就有这个协议的方法,由于过程复杂,没找到相关文档,自己并没有完全实现)


里面有一个方法

- (void)replaceRange:(UITextRange *)range withText:(NSString *)text;

UITextRange很简单,如下:

@interface UITextRange : NSObject

@property (nonatomic, readonly, getter=isEmpty) BOOL empty;     //  Whether the range is zero-length.
@property (nonatomic, readonly) UITextPosition *start;
@property (nonatomic, readonly) UITextPosition *end;

@end

并没有构造方法,而且属性也是只读。但是我们在UITextInput协议里面,还发现了这两个属性

@property (nonatomic, readonly) UITextPosition *beginningOfDocument;
@property (nonatomic, readonly) UITextPosition *endOfDocument;

似乎一切都可以连起来了

UITextRange *textRange = [textView textRangeFromPosition:textView.beginningOfDocument toPosition:textView.endOfDocument];
[textView replaceRange:textRange withText:@""];

这样替换以后,代理方法是可以正常调用的。
我在iOS11上测试没问题,其他系统还没做测试。

你可能感兴趣的:(正确清空UITextView的文字)