cocoa - NSTextView 不可编辑的文本区域?

标签 cocoa nstextview

我有一个 NSTextView,其中包含供用户编辑的数据,但我想用不可编辑数据的页眉和页脚包围它,以便让用户了解上下文。

我认为 NSTextView 无法处理混合可编辑/不可编辑数据的概念,因此我提出了一些想法。

a) 使用带有自定义单元格的文本附件来绘制页眉和页脚。

b) 在 NSScrollView 中有 3 个 NSTextView

c) 使用属性来确定哪些内容不能编辑,并使用委托(delegate)方法来防止编辑,这可能是我最喜欢的,因为它可能是干扰性最小的。

我错过了什么,有什么更好的想法吗?

最佳答案

NSTextView 委托(delegate)方法 -textView:shouldChangeTextInRange:replacementString:会让你这样做。你可以“直接说不”来改变。 ;-)

更新/阐述(2015 年 11 月)

为了根据此答案的评论进行详细说明,我们的想法是在 attributed string 上使用您自己的自定义属性。您的 TextView 正在编辑。超越standard attributes ,您可以指定自己的属性名称(任何 NSString)和 PLIST-compatible object作为该名称的值。

例如,如果您想将一系列文本指定为“不可编辑”,您可以 add an attribute对于该范围,具有名为 @"TextIsEditableAttributeName" 的属性,其 NSNumberBOOL 值为 YESNO:[NSNumber NO]@( NO ) (使用 ObjC 数字装箱 - 相同的结果:一个 NSNumber 实例)。稍后,当 TextView 询问其委托(delegate)是否应更改范围内的文本时,您可以检查该范围是否存在 @"TextIsEditableAttributeName" 属性。

实际上,只需将一个属性分配给不可编辑的范围,因此您甚至不必检查该值。您可以在此处放置一个空的 NSData 实例作为占位符,以便该属性具有值。您的属性名称可以是 @"EditingLocked" 或其他名称。这意味着您只需检查建议范围中的任何位置是否存在@"EditingLocked"属性,并返回NO 当 TextView 询问时。这将捕获可编辑范围与不可编辑范围的重叠选择(如果您允许选择复制不可编辑文本)。

当然,同样的方法也适用于 -textView:willChangeSelectionFromCharacterRanges:toCharacterRanges:,这是另一种委托(delegate)方法,允许您返回“更正”的范围值数组> 供选择。如果您不想允许选择不可编辑的文本,则可以“剪切”在建议范围中找到的 @"EditingLocked" 属性的任何实例所描述的范围。

我希望这会有所帮助。

关于cocoa - NSTextView 不可编辑的文本区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1750250/

相关文章:

objective-c - 如何子类 NSArrayController 来选择添加 : 上的文本字段

cocoa - 我的应用程序被拒绝。它访问 '/usr/lib/libpcap.A.dylib' 我该怎么做才能避免它?

swift - 如何向 NSTableViewDelegate 协议(protocol)添加方法?

cocoa - Cocoa 和 SVG 解释贝塞尔曲线的方式有什么区别?

objective-c - Swift 3 中的 withMemoryRebound 不适用于 Objective-C 结构指针

cocoa - NSTextView - 将 initWithHTML 与表格一起使用

cocoa - NSTextView 像 NSTextField 一样结束编辑操作

objective-c - NSTextView 语法高亮

objective-c - NSTextView 封闭 ScrollView 在空格键上跳转

cocoa - NSTextView 判断 NSTextAttachment 是否存在