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

Kyl*_*yle 5 macos cocoa nstextview

如果我的NSTextView状态为:

NSTextView已选择部分文本

我如何才能告诉textview,如果用户按下shift+right,而不是直接向'o'扩展,而是取消选择'e'?我虽然这曾与做的亲和力,但我试图将它设置为两个NSSelectionAffinityUpstream,并NSSelectionAffinityDownstream通过下面的代码:

[self setSelectionRange: NSMakeRange(9,6)
               affinity: x
         stillSelecting: NO];
Run Code Online (Sandbox Code Playgroud)

但这没什么不同。击球shift+right仍然选择了“O”。

NSTextView知道该怎么做,因为如果您将光标定位在'w'和'o'之间,请按shift+left直到它匹配屏幕截图,然后按shift+right,它与我提到的行为匹配。

我可以重写shift+arrow代码并自己编写代码,但我宁愿NSTextView自己做。有人知道我是否有任何遗漏吗?

Jos*_*zzi 2

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

选择亲和力并不完全像听起来那样起作用(在刚刚研究之后,这对我来说是一个惊喜)。NSResponder事实上,亲和力与对应于移动和选择修改的继承动作之间似乎存在脱节。我稍后会讲到这一点。

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

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

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

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