NSTextView不可编辑的文本区域?

时间:2009-11-17 16:57:07

标签: cocoa nstextview

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

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

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

b)NSTextView内有NSScrollView个。{/ p>

c)使用属性来确定无法编辑的内容,并使用委托方法来阻止编辑,这可能是我最喜欢的,因为它可能是最不具侵入性的。

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

1 个答案:

答案 0 :(得分:7)

NSTextView委托方法-textView:shouldChangeTextInRange:replacementString:将允许您执行此操作。你可以“只说不”改变。 ; - )

更新/详细说明(2015年11月)

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

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

实际上,只需要为可编辑的范围分配属性,因此您甚至不必检查该值。你可以在那里为占位符放置一个空的NSData实例,这样该属性就有了一个值。您的属性名称可以是@"EditingLocked"或其他内容。这意味着您只需在建议的范围中的任意位置检查@"EditingLocked"属性状态,并在文本视图询问时返回NO。这将捕获可编辑范围与不可编辑范围的重叠选择(如果允许选择复制不可编辑文本)。

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

我希望这会有所帮助。