【问题标题】:NSTextView textDidChange/didChangeText not called for bindingsNSTextView textDidChange/didChangeText 未调用绑定
【发布时间】:2012-12-14 09:31:43
【问题描述】:

我有一个自定义的NSTextView 实现,它会自动调整字体大小,以便文本填满整个视图。

我重写了didChangeText 来调用我的字体大小调整方法。当用户编辑文本时效果很好,但通过绑定设置文本视图内容时不会调用didChangeText(和委托方法textDidChange:)。

字体调整代码需要在文本设置/更改时运行,而不仅仅是用户更改时。

如何检测到 NSTextView 中文本的所有更改,即使是通过绑定?

注意:如果有更好的方法让文本填满整个文本视图而不是增加字体大小,请告诉我。

【问题讨论】:

  • 你添加了 吗?并将 NSTextView(不是 NSScrollView)的委托属性与应该接收委托的对象连接起来。 -(void)textDidChange:(NSNotification *)notification { NSLog(@"textDidChange called"); }
  • 是的,我尝试使用委托,但是通过绑定更新视图时不会调用 textDidChange:。

标签: cocoa cocoa-bindings nstextview


【解决方案1】:

最好将字体属性设置为绑定到文本视图的“attributedString”的NSAttributedString。在textDidChange: 委托方法中,您只需使用正确的字体属性重新创建NSAttributedString。

【讨论】:

  • 我正在做类似的事情。我的问题是最初设置文本视图的内容时没有调用我的字体调整代码。
  • 如果你做得对,绑定的属性(即它的访问器)将始终返回具有正确字体(你已确定)属性的 NSAttributedString。
  • 绑定的属性是一个简单的 NSString,而不是 NSAttributedString。尽管如此,我还是想设置一个自定义字体。
  • 这不是主要问题的正确答案。
【解决方案2】:

当绑定更新文本(与文本视图更新模型相反)时,不会调用 NSTextView 方法 didChangeText。

didChangeText 是绑定更新的来源。如果您覆盖它并且不调用 super,则绑定被破坏。 didChangeText 调用委托方法 textDidChange。

不幸的是,在 NSTextView 更新过程中,didChangeText 也被调用得相当晚 - 在布局和存储委托调用之后。

我发现 NSTextStorageDelegate 方法“didProcessEditing”是捕捉绑定字符串更改的最佳方式。尽管此时您必须小心您可以对 textview 进行哪些更改 - 一些调用崩溃了。

我在这里更全面地回答了我自己的类似问题: NSTextView textDidChange not called through binding

【讨论】:

  • 感谢您的提醒!我不太记得当时我是如何解决问题的,但这些天我使用自定义的NSTextStorage 连接到didProcessEditing,类似于您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多