2009-11-17 108 views
3

我有一个NSTextView,其中包含供用户编辑的数据,但我想用一个不可编辑数据的页眉和页脚来包围它,以便为用户提供上下文的概念。NSTextView不可编辑的文本区域?

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

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

b)在NSScrollView内有3 NSTextView s。

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

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

回答

7

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

更新/详述(月,2015年)

阐述基于这个答案的意见,想法是使用在attributed string你的文本视图自己的自定义属性是编辑。除standard attributes之外,您可以指定您自己的属性名称(任何NSString)和PLIST-compatible object作为该名称的值。

例如,如果你想指定范围的文本为“不可编辑”,你可以add an attribute该范围与命名(例如)@"TextIsEditableAttributeName"属性与NSNumberYESNO一个BOOL值:[NSNumber NO]@(NO)(使用ObjC号码装箱 - 相同的结果:一个NSNumber实例)。之后,当文本视图询问其代表是否应该更改范围内的文本时,可以检查该范围是否存在@"TextIsEditableAttributeName"属性。

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

同样的方法,当然,可连续工作-textView:willChangeSelectionFromCharacterRanges:toCharacterRanges:,另一个委托方法,允许你返回范围内的“校正”阵列,用于选择值。如果您不想允许选择不可编辑的文本,则可以“删除”您在建议范围内找到的任何@"EditingLocked"属性实例所描述的范围。

我希望这会有所帮助。

+0

页脚的'范围'可能会根据用户的编辑而改变,所以我想我可以使用自定义属性来跟踪。 我认为这听起来像迄今为止最好的办法... 感谢您的意见。 – 2009-11-17 19:39:58

+0

这是自定义属性的重要组成部分。 :-) – 2009-11-17 19:54:30

+0

你能分享你如何能够实现分配自定义属性以跟踪文本(随着范围的变化)。 – Ekra 2012-04-15 14:38:36

相关问题