macos - 如何告诉 NSTextView 在哪一侧扩展选择?

标签 macos cocoa nstextview

如果我有一个处于这种状态的 NSTextView:

NSTextView with partial text selected

我如何告诉 TextView ,如果用户按 shift+right,它不会向右延伸到“o”,而是取消选择“e”?我认为这与affinity有关,但我尝试通过以下代码将其设置为 NSSelectionAffinityUpstreamNSSelectionAffinityDownstream:

[self setSelectionRange: NSMakeRange(9,6)
               affinity: x
         stillSelecting: NO];

但这并没有什么不同。按 shift+right 仍选择“o”。

NSTextView 知道如何执行此操作,因为如果您将光标放在“w”和“o”之间,然后按 shift+left 直到它与屏幕截图匹配,然后点击 shift+right,它符合我提到的行为。

我可以覆盖 shift+arrow 代码并推出自己的代码,但我宁愿允许 NSTextView 做自己的事情。有人知道我是否遗漏了什么吗?

最佳答案

我不确定您要做什么,因为这是默认的文本移动/选择修改行为。您是否尝试覆盖此行为以始终执行这一操作,或者您是否尝试添加另一个键盘快捷键来覆盖此行为?无论哪种情况,一些背景:

选择亲和性并不完全像听起来那样起作用(在刚刚研究之后,这让我感到惊讶)。事实上,关联性和继承的与移动和选择修改相对应的 NSResponder 操作之间似乎存在脱节。我稍后会讲到这一点。

您想要查看的是响应者操作,例如 -moveBackwardAndModifySelection:-moveWordBackwardAndModifySelection: 等。根据文档,对此类选择修改移动操作的第一次调用确定了选择的“结束”,该选择将通过后续调用来修改,以在任一方向上修改选择。这意味着,如果您的第一个操作是选择前进 (-moveForwardAndModifySelection:),则“前进端”(从左到右的语言中为右端;从右到左的语言中为左端),自动) 是从那时起将要修改的内容,无论您调用 -moveForward... 还是 -moveBackward...

通过查看 open source Cocoatron version of NSTextView,我发现关联性和 -move...AndModifySelection: 之间存在脱节。 。看来任何移动和选择方法都没有引用内部 _affinity 属性。它根据 _selectionOrigin 确定选择范围更改应该是“上游”还是“下游”,这是修改选择范围时设置的私有(private)属性(通过 -setSelectedRange(s) ... 方法或鼠标按下/拖动)。我认为亲和性属性只是供您引用。重写它以始终返回一个值或另一个值不会改变任何行为,它只是向外部人员错误报告。 _selectionOrigin 似乎只能通过 -setSelectedRanges... 方法修改如果选择为零长度(即,仅光标放置)。

因此,考虑到所有这些,您可能需要在手动选择修改中添加一个步骤:首先设置一个空选择,其中包含您希望选择原点所在的位置(如果您想要向后关联,则为前端) ;如果您想要前向亲和性,则为向后端),然后设置具有所需亲和性的非零长度选择。

我知道这是迂回和荒谬的,但我认为考虑到 CocoaTron 源代码,事情就必须如此。

关于macos - 如何告诉 NSTextView 在哪一侧扩展选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30852721/

相关文章:

iphone - UIToolbar 中的持久 UIBarButtonItem?

objective-c - 无法让 Cocoa 通知发挥作用

ios - 如何取消设置 NSFetchRequest 的 fetchLimit?

Cocoa:阻止字段编辑器按空格键自动完成

macos - 连续 NSTextField

php - Mac os X PHP56 ApcU 通过 Brew - 找不到符号 : _zend_signal_globals

Cocoa - 可以启动、暂停、恢复的计时器对象?

macos - 在 NSTextField 中输入时使鼠标光标保持可见

macos - 增加 NSTableView 行高

objective-c - NSTextView复制粘贴问题