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

时间:2015-06-15 18:43:47

标签: macos cocoa nstextview

如果我有NSTextView处于此状态:

NSTextView with partial text selected

我如何告诉textview如果用户按 shift + right ,而不是向右延伸到' o而是取消​​选择&#39 ; E&#39 ;?我虽然这与affinity有关,但我尝试通过以下代码将其设置为NSSelectionAffinityUpstreamNSSelectionAffinityDownstream

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

但这并没有什么不同。点击 shift + right 仍然选择了' o'。

NSTextView知道如何做到这一点,因为如果光标位于' w'之间。和' o',然后按 shift + left 直到它与屏幕截图匹配,然后按 shift + right ,它匹配我提到的行为。

我可以覆盖 shift + arrow 代码并自行滚动,但我宁愿允许NSTextView做自己的事情。任何人都知道我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

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

选择亲和力并不像听起来那样有效(在我刚研究之后,这对我来说是一个惊喜)。实际上,对于移动和选择修改,亲和力和继承的NSResponder动作之间似乎存在脱节。我马上就能做到这一点。

您要查看的是响应者操作,例如-moveBackwardAndModifySelection:-moveWordBackwardAndModifySelection:等。根据文档,对这种选择修改运动动作的第一次调用决定了" end"将随后调用修改选择,以修改任一方向的选择。这意味着,如果您的第一个操作是选择转发(-moveForwardAndModifySelection:),那么"前端" (从左到右语言的右端;从左到右,从左到右,自动)是从那一点开始修改的内容,无论你是拨打-moveForward...还是-moveBackward...

通过查看open source Cocoatron version of NSTextView,我发现亲和力与-move...AndModifySelection:之间存在脱节。似乎在任何移动和选择方法中都没有查询内部_affinity属性。它确定选择范围变化是否应该是"上游"或"下游"基于_selectionOrigin,在修改选择范围时设置的私有属性(通过-setSelectedRange(s)...方法或鼠标按下/拖动)。我认为亲和属性就在那里供你咨询。覆盖它总是返回一个值或另一个值并不会改变任何行为,它只会误报给外人。 _selectionOrigin似乎只能通过-setSelectedRanges...方法进行修改,如果选择为零长度(即只放置光标)。

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

回旋和荒谬,我知道,但考虑到CocoaTron源代码,我认为它是如何实现的。