UITextView UITextViewTextDidChangeNotification未在程序更改文本时调用

时间:2015-04-14 15:11:07

标签: ios iphone input ios8 uitextview

我在自定义UITextView的初始化中调用它:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(textChanged:)
                                                 name:UITextViewTextDidChangeNotification
                                               object:self];

当我以编程方式设置textChanged

时,不会调用方法textView.text = @""

关于我做错了什么的想法?

4 个答案:

答案 0 :(得分:5)

您不应该将self传递给最后一个参数,此参数是notificationSender,这意味着您只想观察self发送的通知。

观察者是这样的:

[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(textChanged:)
                                      name:UITextViewTextDidChangeNotification
                                      object:nil];

希望它可以提供帮助。

答案 1 :(得分:1)

提到的委托模式@Prince如下工作。在您的自定义UITextView初始化中:

[self setDelegate:self];

然后实施appropriate delegate method

#pragma - UITextViewDelegate

- (void)textViewDidChange:(UITextView *)textView
{
    // Move the body of textChanged here
    // ...
}

这是管理对亲密/ 1:1关系中的更改的响应的首选方式,如this excellent post中所述。

答案 2 :(得分:0)

extension UITextView {

func centerVertically() {
    let fittingSize = CGSize(width: bounds.width, height: CGFloat.greatestFiniteMagnitude)
    let size = sizeThatFits(fittingSize)
    let topOffset = (bounds.size.height - size.height * zoomScale) / 2
    let positiveTopOffset = max(1, topOffset)
    contentOffset.y = -positiveTopOffset
}

}

//要在编辑时更新文本,请使用以下代码。

  func textViewDidChange(_ textView: UITextView) {
    textView.centerVertically()
}

答案 3 :(得分:0)

您可以创建自己的类并覆盖文本属性

class MyTextView: UITextView {
   override var text: String! {
      didSet {
        //do your stuff
      }
   }
}