UITextView UITextViewTextDidChangeNotification 在文本的编程更改时未被调用

Posted

技术标签:

【中文标题】UITextView UITextViewTextDidChangeNotification 在文本的编程更改时未被调用【英文标题】:UITextView UITextViewTextDidChangeNotification not being called on programmatic change of the text 【发布时间】:2015-04-14 15:11:06 【问题描述】:

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

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

当我以编程方式设置textView.text = @""时,没有调用方法textChanged

关于我做错了什么有什么想法吗?

【问题讨论】:

不需要观察者作为使用 [yourTextView addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged]; 为什么你使用通知而不是委托方法 我必须在文本视图及其超级视图中使用它 @Prince 以前没用过,能不能详细说明一下 【参考方案1】:

你不应该将self传递给最后一个参数,这个参数是notificationSender,表示你只想观察self发送的通知。

这样的观察者:

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

希望对你有帮助。

【讨论】:

有趣 - 我没有意识到这一点 - 链接到文档以获得更多颜色:developer.apple.com/library/mac/documentation/Cocoa/Reference/…: 但是如果你不传递 self ,当应用程序中的任何 UITextView 的文本发生更改时,都会调用选择器,当你在一个屏幕中使用多个 UITextView 时会产生很多开销。【参考方案2】:

@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 中所述。

【讨论】:

不,这只是意味着您不能在其他地方使用委托,因为您经常需要这样做。对于像这样的“低级别”更改,您只需使用通知即可。【参考方案3】:
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()

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于UITextView UITextViewTextDidChangeNotification 在文本的编程更改时未被调用的主要内容,如果未能解决你的问题,请参考以下文章

当 UITextView 的文本超出 1 行时展开 UITextView 和 UITableView

选择另一个 UITextView 时,如何阻止 UITextView 退出第一响应者/关闭键盘?

从 UIView 中的 UITextView 复制文本后,UITextView 更改为 UIWebDocumentView?

UITextView 数据变化迅速

UITextView contentInset 在 iOS 7 上的 UITextView 中不起作用?

UITextView 设置属性后做啥?