12

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

[self.textView setText:@""];

委托方法textViewDidChange:不会被调用。有没有办法在创建UITextView子类的情况下找到它?

4

7 回答 7

29

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

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

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

做这件事的一种骇人听闻的方式,但它完成了工作。

于 2014-08-27T23:03:50.207 回答
7

我赞成@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
}

此代码段举例说明了一种可敬的模式,该模式将使您的代码更具可读性。

于 2014-08-27T23:19:55.510 回答
5

在swift中,您可以覆盖 UITextView 类中的文本变量

class MyTextView: UITextView {

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

}
于 2018-09-21T11:09:38.327 回答
2

旧帖子,但我遇到了同样的问题,并认为我会分享我的解决方案(在 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 {
于 2018-07-09T10:54:50.010 回答
0

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

[自我 textViewDidChange:self.textView]

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

于 2020-04-20T19:12:13.020 回答
0

委托方法textDidChange不响应文本中的编程更改,您可以使用观察来获得通知

  1. 声明你的文本视图变量@objc dynamic
  2. 声明并持有一个类型为变量NSKeyValueObservation
  3. 使用函数observe(_:changeHandler:)绑定文本视图的文本属性,将返回值保存在步骤 2 中声明的变量中
  4. 观察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)
    }
}
于 2021-11-04T02:35:23.010 回答
-1

改用这个:(这不会重置当前文本

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

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

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

或者

[self.textView setText:@""];
[self.textView insertText:@"something"];
于 2016-04-29T14:33:38.393 回答