使用UITextView时,如果实现了它的代理方法去监听文字内容的变化,会实现如下方法。
- (void)textViewDidChange:(UITextView *)textView
但是当代码清空UITextView的文字时,如果使用
- [UITextView setText:]
可以发现文字确实是清空了,但是代理方法却并没有走,查看最新的SDK头文件,发现text属性是copy的,不知道和这个有没有关系。但是细细找找,会发现UITextView实现了iOS里面文字输入的一个协议(我记得之前自己实现过一个输入文本的View,当时用方法里面就有这个协议的方法,由于过程复杂,没找到相关文档,自己并没有完全实现)
<UITextInput>
里面有一个方法
- (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上测试没问题,其他系统还没做测试。
网友评论