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?