我有一个NSTextView
,其中包含供用户编辑的数据,但我想用不可编辑数据的页眉和页脚来围绕它,以便让用户了解上下文。
我认为NSTextView
无法处理混合可编辑/不可编辑数据的概念,所以我想出了一些想法。
a)使用带有自定义单元格的文本附件来绘制页眉和页脚。
b)NSTextView
内有NSScrollView
个。{/ p>
c)使用属性来确定无法编辑的内容,并使用委托方法来阻止编辑,这可能是我最喜欢的,因为它可能是最不具侵入性的。
我错过了什么,有什么更好的想法吗?
答案 0 :(得分:7)
NSTextView委托方法-textView:shouldChangeTextInRange:replacementString:将允许您执行此操作。你可以“只说不”改变。 ; - )
更新/详细说明(2015年11月)
根据对此答案的评论进行详细说明,我们的想法是在您的文字视图正在编辑的attributed string上使用您自己的自定义属性。除standard attributes之外,您可以指定自己的属性名称(任意NSString
)和PLIST-compatible object作为该名称的值。
例如,如果您想将一系列文字指定为“不可编辑”,则可以add an attribute为该范围添加一个名为(例如)@"TextIsEditableAttributeName"
且NSNumber
的属性BOOL
值为YES
或NO
:[NSNumber NO]
或@( NO )
(使用ObjC数字装箱 - 相同结果:NSNumber实例)。稍后,当文本视图询问其代理是否应更改范围内的文本时,您可以检查@"TextIsEditableAttributeName"
属性是否存在的范围。
实际上,只需要为不可编辑的范围分配属性,因此您甚至不必检查该值。你可以在那里为占位符放置一个空的NSData
实例,这样该属性就有了一个值。您的属性名称可以是@"EditingLocked"
或其他内容。这意味着您只需在建议的范围中的任意位置检查@"EditingLocked"
属性的状态,并在文本视图询问时返回NO
。这将捕获可编辑范围与不可编辑范围的重叠选择(如果允许选择复制不可编辑文本)。
当然,这种方法可以用于-textView:willChangeSelectionFromCharacterRanges:toCharacterRanges:
,这是另一种委托方法,允许您返回“已更正”的范围值数组以供选择。如果您不想允许选择不可编辑的文本,则可以“剪切”您在建议范围内找到的@"EditingLocked"
属性的任何实例所描述的范围。
我希望这会有所帮助。