我有一个 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"
的属性,其 NSNumber
的 BOOL
值为 YES
或 NO
:[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/