【问题标题】:NSTextView non-editable areas of text?NSTextView 不可编辑的文本区域?
【发布时间】:2009-11-17 16:57:07
【问题描述】:

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

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

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

b) 在NSScrollView 中有3 个NSTextViews。

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

我是否遗漏了什么,有什么更好的想法吗?

【问题讨论】:

    标签: cocoa nstextview


    【解决方案1】:

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

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

    为了详细说明这个答案的 cmets,想法是在您的文本视图正在编辑的 attributed string 上使用您自己的自定义属性。除了standard attributes,您还可以指定自己的属性名称(任何NSString)和PLIST-compatible object 作为该名称的值。

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

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

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

    我希望这会有所帮助。

    【讨论】:

    • 页脚的“范围”可能会根据用户所做的编辑而改变,所以我想我可以使用自定义属性来跟踪。我认为这听起来是迄今为止最好的方法......感谢 cmets。
    • 这是自定义属性的重要组成部分。 :-)
    • 你能分享一下你是如何实现分配自定义属性来跟踪文本的(随着范围的变化)。
    • @Ekra:请阅读文档。在 Apple 文档中快速搜索“自定义属性”会发现几个与文本相关文档的链接。阅读所有与文本系统相关的结果将为您提供坚实的基础。从那里,如果您有这些问题,请询问有关 SO 的更具体问题。
    • 通过详细说明更新了我的答案。虽然最初的答案是在 09 年给出的,而我的最后一条评论是在 12 年,但这种方法仍然有效(而且,IMO,绝对是 Cocoa 文本系统中最好的)。不过,我想我会更加充实这个概念,因为这个问题仍然可以投票。
    猜你喜欢
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 2012-07-31
    相关资源
    最近更新 更多