当我以编程方式设置我的 UITextView
如下:
[self.textView setText:@""];
委托方法 textViewDidChange:
不会被调用。 有没有一种方法可以找到它,而无需创建一个 UITextView
子类?
当我以编程方式设置我的 UITextView
如下:
[self.textView setText:@""];
委托方法 textViewDidChange:
不会被调用。 有没有一种方法可以找到它,而无需创建一个 UITextView
子类?
如果使用代码手动设置UITextView
的文本内容,那么textViewDidChange:
方法将不会被调用。(但是,如果你设置了你的文本视图的delegate
,当用户编辑它时它将被调用。)
一种可能的解决方法是在编辑文本时手动调用textViewDidChange:
方法。例如:
[self.textView setText:@""];
[self textViewDidChange:self.textView];
这种做法有点取巧,但它能够完成任务。
[self.textView.delegate textViewDidChange:self.textView]
更安全,以防delegate
更改为不同于self
的对象。 - Iulian Onofrei- (void)whereIManuallyChangeTextView
{//you don't actually have to create this method. It's simply wherever you are setting the textview to empty
[self.textView setText:@""];
[self respondToChangeInTextView:self.textView];
}
- (void)textViewDidChange:(UITextView *)textView
{
//...some work and then
[self respondToChangeInTextView:textView];
}
- (void)respondToChangeInTextView:(UITextView *)textView
{
//what you want to happen when you programmatically/manually or interactively change the textview
}
在Swift中,您可以重写UITextView
类的text
变量:
class MyTextView: UITextView {
override public var text: String? {
didSet {
self.textViewDidChange(self)
}
}
}
虽然这是一个旧帖子,但我也遇到了同样的问题,所以我想分享一下我的解决方案(使用Swift)。
textViewDidChange(_ textView: UITextView)
通过设置文本属性不会被调用,但是当使用replace(range: UITextRange, withText: String)
时它就会被调用。因此,您需要为UITextView的整个字符串创建一个UITextRange,并用新字符串替换它。
// Create a range of entire string
let textRange = textView.textRange(from: textView.beginningOfDocument, to: textView.endOfDocument)
// Create a new string
let newText = ""
// Call Replace the string in your textView with the new string
textView.replace(textRange!, withText: newText)
class ViewController: UIViewController, UITextViewDelegate {
委托方法textDidChange
无法响应文本的编程更改,您可以使用观察来获得通知。
@objc dynamic
声明您的文本视图变量。NSKeyValueObservation
的变量。observe(_:changeHandler:)
绑定您的文本视图的文本属性,并将返回值与步骤2中声明的变量一起保存。changeHandler
中观察更改。示例:
@objc dynamic private var textView: UITextView!
private var observation: NSKeyValueObservation?
func bind() {
observation = observe(\.textView.text, options: [.old, .new]) { object, change in
print(object, change)
}
}
这样你就不必每次设置UITextView文本时都调用它了。[self textViewDidChange:self.textView]
[self.textView insertText:@"something"];
这将调用委托并在光标所在位置添加文本。当然,如果您想重置整个文本,可以执行以下操作:
[self.textView setText:@""];
[self textViewDidChange:self.textView];
或者
[self.textView setText:@""];
[self.textView insertText:@"something"];
insertText()
会调用textViewDidChange
。 - trndjc