为什么 - [NSTextInputClient doCommandBySelector:]没有将事件传递给响应者链?

时间:2018-01-20 09:10:30

标签: macos cocoa nstextview nsresponder responder-chain

文本视图不应转发响应者链上的不可撤销命令,-[NSTextInputClient doCommandBySelector:]aSelector

  

如果无法调用doCommandBySelector:,则NSResponder不应将此消息传递给响应者链。 NSTextInputClient也实现了这种方法,它确实将响应者链中的不可撤销命令转发,但文本视图不应该。实现NSView,协议的文本视图继承自NSResponder继承的NSResponder,因此您对此方法的实现将覆盖NSResponder中的方法。它不应该叫超级。

如果我的文字理解不会让我失望,那么最后一句话并没有澄清,只是重新阐述了事情的设置方式。

所以基本上只是一个处方:“文本视图不应该”。周期。

但为什么呢?

我可以理解一个案例,你希望文本视图不对任何/所有import collections class MyStack: def __init__(self): self._data = [] def push(self, value): self._data.append(value) def size(self): #Return the number of elements in the stack return len(self._data) def toString(self): #Return a string representing the content of this stack return str(self._data) class MyQueue: def __init__(self): self._data = collections.deque([]) def enqueue(self, value): self._data.append(value) def dequeue(self): return self._data.popleft() def size(self): #return the number of elements in the queue return len(self._data) queue1 = MyQueue() dq = MyStack() stack1 = MyStack() stack1.push(['stone', 'atone']) print "size of stack is now :" ,stack1.size() queue1.enqueue(stack1) print "size of queue is now :", queue1.size() print "size of stack is now :" ,stack1.size() stack1.push(['stone', 'shone']) stack1.push(['stone', 'scone']) dq = queue1.dequeue() # i would like dq to be ['stone','atone'] print dq.toString() 方法做出反应,但是将它们委托给它的视图控制器,例如。这会引起麻烦吗?这只是建议在macOS应用程序中保持文本视图行为一致吗?

1 个答案:

答案 0 :(得分:1)

来自The Key-Input Message Sequence

  

如果第一个响应者是文本视图,则键事件进入文本系统。键窗口向文本视图发送keyDown:消息,并将事件作为其参数。 keyDown:方法将事件传递给handleEvent:,它将字符输入发送到输入上下文以进行键绑定和解释。作为响应,输入上下文将insertText:replacementRange:,setMarkedText:selectedRange:replacementRange:或doCommandBySelector:发送到文本视图。

如果文本视图处理键事件并且滚动视图或某个其他视图收到doCommandBySelector:消息,则不正确。您不能向doCommandBySelector:发送super,但您可以将选择器发送给代表。