3

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

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

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

b)NSTextView在 内有 3 秒NSScrollView

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

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

4

1 回答 1

8

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

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

根据对此答案的评论进行详细说明,其想法是在您的文本视图正在编辑的属性字符串上使用您自己的自定义属性。除了标准属性之外,您还可以指定自己的属性名称(任何NSString)和PLIST 兼容的对象作为该名称的值。

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

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

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

我希望这有帮助。

于 2009-11-17T19:32:24.477 回答