在UITextView上更改文本时是否有委托调用?

时间:2014-08-27 22:51:18

标签: ios cocoa-touch uitextview uitextviewdelegate

当我以编程方式设置UITextView时:

[self.textView setText:@""];

委托方法textViewDidChange:未被调用。有没有办法找到而不用制作UITextView子类?

6 个答案:

答案 0 :(得分:21)

使用代码手动设置UITextView的文本时,不会调用textViewDidChange:方法。 (如果您设置了文本视图delegate,则会在用户编辑时调用它。)

一种可能的解决方法是在编辑文本时手动调用textViewDidChange:。例如:

[self.textView setText:@""];
[self textViewDidChange:self.textView];

这种做法的一种hackish方式,但它完成了工作。

答案 1 :(得分:5)

我赞成@ rebello95的回应,因为这是一种方法。但另一种不那么黑客的做法是

-(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
}

这个代码段举例说明了一个让您的代码更具可读性的可敬模式。

答案 2 :(得分:0)

旧帖子,但我遇到了同样的问题,并认为我会分享自己的解决方案(在Swift中)。

textViewDidChange(_ textView: UITextView)不能仅通过设置text属性来调用,而是在使用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)

应该这样做。当然,您需要设置UITextViewDelegate使其起作用:

class ViewController: UIViewController, UITextViewDelegate {

答案 3 :(得分:0)

您可以迅速在UITextView类中覆盖text变量

class MyTextView: UITextView {

    override public var text: String? {
        didSet {
            self.textViewDidChange(self)
        }
    }

}

答案 4 :(得分:0)

您还可以继承UITextView并覆盖setText以包括

[self textViewDidChange:self.textView]

这样您就不必在每次设置UITextView的文本时都调用它。

答案 5 :(得分:-1)

请改用:( 这不会重置当前文字

find / -mtime -1 -name *log

这将调用委托,并将在光标所在的位置添加文本。当然,如果您想重置整个文本,您可以:

[self.textView insertText:@"something"];

[self.textView setText:@""];
[self textViewDidChange:self.textView];