我有一個覆蓋它的父窗口的內容視圖的NSView。該視圖具有一個單擊事件處理程序,將其從內容視圖中刪除。在這個觀點裏面,我有另一種觀點。當我在這個內部視圖中拖動鼠標時,鼠標事件不僅應用於前面的視圖,還應用於後面的視圖。另外,背後的視圖中的遊標也顯示出來。這是在這裏發生的同樣的問題:NSView overlay passes mouse events to underlying subviews?但答案不適用於我的項目,因爲我無法打開另一個窗口。鼠標事件通過NSView出血
謝謝。
我有一個覆蓋它的父窗口的內容視圖的NSView。該視圖具有一個單擊事件處理程序,將其從內容視圖中刪除。在這個觀點裏面,我有另一種觀點。當我在這個內部視圖中拖動鼠標時,鼠標事件不僅應用於前面的視圖,還應用於後面的視圖。另外,背後的視圖中的遊標也顯示出來。這是在這裏發生的同樣的問題:NSView overlay passes mouse events to underlying subviews?但答案不適用於我的項目,因爲我無法打開另一個窗口。鼠標事件通過NSView出血
謝謝。
沒有看到你的事件處理代碼,很難知道發生了什麼,但我懷疑你可能會調用super
在你的實現中實現各種事件處理方法。
NSView
是NSResponder
的子類,所以默認情況下,未處理的事件通過響應者鏈傳遞。視圖的超級視圖是響應鏈中的下一個對象,因此,如果您在實現‑mouseDown:
時調用了[super mouseDown:event]
,則該事件將傳遞到超級視圖。
修復的目的是確保你的不需要在你的事件處理程序中調用super
的實現。
這是不正確的:
- (void)mouseDown:(NSEvent*)anEvent
{
//do something
[super mouseDown:event];
}
這是正確的:
- (void)mouseDown:(NSEvent*)anEvent
{
//do something
}
這就是我的問題,除了我需要實現鼠標拖動,遊標更新和鼠標移動的空方法外,因爲我已經有了一個鼠標放下的實現。但是,哪個事件處理光標的變化? – Maz
只需使用'-mouseEntered:'和'-mouseExited:'並在這些方法中設置光標。 –
正確。我的視圖封面現在運行良好。 –
羅布的回答和對回答馬茲的評論解決這個問題,但是這只是爲了絕對明確的。爲了防止NSView將其鼠標事件泄露給父級,必須實現空方法。
// NSResponder =========================================
- (void) mouseDown:(NSEvent*)event {}
- (void) mouseDragged:(NSEvent*)event {}
- (void) mouseUp:(NSEvent*)event {}
請發佈最頂層視圖的事件處理代碼。 –