我想實現像C++ NSResponder
一類,在我不明白的事情是這樣的:爲什麼我點擊一個NSButton如果它不是第一響應者?
所有的鍵盤/鼠標交互發送到第一響應者,因此,如果例如的NSTextField是目前第一響應者,在同一視圖中的另一NSButton
如何知道它被點擊?如果文本框不需要鼠標點擊,它會將其發送到它的超級視圖,並且它的超級視圖會將其發送到視圖控制器。所以鼠標點擊事件永遠不會到達按鈕。
這可能是非常明顯的,但目前我無法圍繞它。
我想實現像C++ NSResponder
一類,在我不明白的事情是這樣的:爲什麼我點擊一個NSButton如果它不是第一響應者?
所有的鍵盤/鼠標交互發送到第一響應者,因此,如果例如的NSTextField是目前第一響應者,在同一視圖中的另一NSButton
如何知道它被點擊?如果文本框不需要鼠標點擊,它會將其發送到它的超級視圖,並且它的超級視圖會將其發送到視圖控制器。所以鼠標點擊事件永遠不會到達按鈕。
這可能是非常明顯的,但目前我無法圍繞它。
所有的鍵盤/鼠標交互發送到第一響應
這是不正確。從Cocoa Event Handling Guide:
窗口對象...調度最事件與在NSResponder類消息,諸如 鼠標按下用戶動作相關聯的一個NSView對象 :或的keyDown :. ...
接收事件消息的對象與事件的類型略有不同。對於鼠標和平板電腦事件,NSWindow對象將事件分派到用戶按下鼠標或觸控筆按鈕的視圖。它將大多數關鍵事件分派給 關鍵窗口的第一響應者。
鼠標和鍵盤事件路徑之間的這種區別在特定於這些類型的事件的相關章節中重複出現。
一個按鈕「知道」它被點擊的時間,因爲它是被點擊的東西。該窗口使用-[NSView hitTest:]
方法計算出鼠標光標下的內容。
如果鼠標移出按鈕,如果鼠標事件沒有發送給他,按鈕如何知道鼠標不在那裏?例如,如果圖像更改爲懸停圖像,並且鼠標移出時按鈕需要將其更改回正常圖像? – levidhuyvetter
首先,按鈕在'-mouseDown:'實現中啓動內部事件循環的可能性很大。所以,它會得到所有*事件直到鼠標移動。但即使沒有,我鏈接到的相同文檔也說了一下:「鼠標拖動和鼠標移動事件通常發送到接收最近鼠標事件的相同視圖。」 –
我幾次讀到你的答案,並且花了我一段時間才明白你所做的區別,所以在這裏它是黑白的以備將來的搜索:1)對於'鼠標點擊',鼠標下的東西接收事件消息,例如一個NSButton。 2)對於(大多數)鍵盤上的按鍵,窗口的第一響應者接收事件消息。 – 7stud