2011-07-06 43 views
6

我有一個覆蓋它的父窗口的內容視圖的NSView。該視圖具有一個單擊事件處理程序,將其從內容視圖中刪除。在這個觀點裏面,我有另一種觀點。當我在這個內部視圖中拖動鼠標時,鼠標事件不僅應用於前面的視圖,還應用於後面的視圖。另外,背後的視圖中的遊標也顯示出來。這是在這裏發生的同樣的問題:NSView overlay passes mouse events to underlying subviews?但答案不適用於我的項目,因爲我無法打開另一個窗口。鼠標事件通過NSView出血

謝謝。

+0

請發佈最頂層視圖的事件處理代碼。 –

回答

12

沒有看到你的事件處理代碼,很難知道發生了什麼,但我懷疑你可能會調用super在你的實現中實現各種事件處理方法。

NSViewNSResponder的子類,所以默認情況下,未處理的事件通過響應者鏈傳遞。視圖的超級視圖是響應鏈中的下一個對象,因此,如果您在實現‑mouseDown:時調用了[super mouseDown:event],則該事件將傳遞到超級視圖。

修復的目的是確保你的不需要在你的事件處理程序中調用super的實現。

這是不正確的:

- (void)mouseDown:(NSEvent*)anEvent 
{ 
    //do something 
    [super mouseDown:event]; 
} 

這是正確的:

- (void)mouseDown:(NSEvent*)anEvent 
{ 
    //do something 
} 
+1

這就是我的問題,除了我需要實現鼠標拖動,遊標更新和鼠標移動的空方法外,因爲我已經有了一個鼠標放下的實現。但是,哪個事件處理光標的變化? – Maz

+0

只需使用'-mouseEntered:'和'-mouseExited:'並在這些方法中設置光標。 –

+0

正確。我的視圖封面現在運行良好。 –

2

羅布的回答和對回答馬茲的評論解決這個問題,但是這只是爲了絕對明確的。爲了防止NSView將其鼠標事件泄露給父級,必須實現空方法。

// NSResponder ========================================= 
- (void) mouseDown:(NSEvent*)event {} 
- (void) mouseDragged:(NSEvent*)event {} 
- (void) mouseUp:(NSEvent*)event {}