【发布时间】:2015-12-16 21:36:02
【问题描述】:
通常有一个文本编辑器来处理代码或其他结构化内容,以平衡某种分隔符;当您双击 { 它会选择匹配的 } 或类似地选择 ( ) 对、[ ] 对等。如何在 Cocoa/Obj-C 中的 NSTextView 中实现此行为?
(我将立即发布答案,因为我在 SO 上没有发现任何关于此的内容,所以今天花了很多时间实施解决方案。欢迎提供更好的答案。)
附录:
这与this question 不同,后者是关于NSTextField,主要关注NSTextField 和字段编辑器问题。 如果通过将自定义NSTextView 子类替换为字段编辑器来解决该问题,那么该自定义子类当然可以使用此处给出的解决方案;但是可能有许多其他方法可以解决NSTextField 的问题,并且将自定义NSTextView 子类替换到字段编辑器中显然不是解决该问题的正确方法,无论如何,程序员关心@ 中的分隔符平衡987654331@(这可能是更常见的问题)可能不太关心所有这些NSTextField 和字段编辑器问题。所以这是一个不同的问题——尽管我会在这个问题上添加一个链接,作为它可能的一个方向。
这也和this question不一样,这实际上是在双击发生时改变NSTextView中“单词”的定义。根据Apple's documentation,这些是不同解决方案的不同问题;对于分隔符平衡(这个问题)Apple 特别推荐使用NSTextView 的selectionRangeForProposedRange:granularity: 方法,而对于更改单词的定义(那个问题)Apple 特别声明selectionRangeForProposedRange:granularity: 方法不应该 被使用。
【问题讨论】:
-
您还向另一个重复的问题发布了 answer,所以我不确定您为什么要发布此问题。
-
@KenThomases,这些不是重复的。请仔细看。您标记为与此问题重复的问题是关于 NSTextField,而不是 NSTextView,主要涉及处理字段编辑器问题(与 NSTextField 一样)。那是一个不同的班级,有不同的问题。查看下面发布的答案,它使用了 Apple 为 NSTextView 专门推荐的 selectionRangeForProposedRange:granularity:。 NSTextField 问题不能使用(至少不能直接使用),因为这不是 NSTextField 方法。
-
您在上面的评论中作为重复项提到的另一个问题也不是重复项。另一个问题是关于自定义双击选择以遵守不同的单词边界;特别是在所有情况下都将句点视为单词分隔符。根据 Apple 的文档,正如在两个答案中仔细审查的那样,这是一个不同的问题,需要不同的解决方案; Apple 声明 selectionRangeForProposedRange:granularity: 应该专门不用于解决该问题(但应该用于分隔符平衡)。
-
@KenThomases 我已经编辑了问题以使这些区别更加清晰。如果您同意,那么我们可能可以删除所有这些 cmets;我不确定 SO 上的礼仪是什么。
-
我重新打开了它。我不确定我是否同意它确实与第一个完全不同,尽管您链接了文档,但在我看来
-selectionRangeForProposedRange:granularity:不适合这项任务,因为您必须通过体操确定是否需要双击。但是,无论如何。
标签: objective-c macos cocoa nstextview