2013-04-20 33 views
0

我正在編寫一個程序,該程序具有不同內容的子類NSView(框架)的數量,可以通過鼠標在其超級視圖中拖動。所有視圖都包含一個名爲contentView的子視圖,該視圖又可以包含更復雜的層次結構。mouseDragged:是不是傳遞了兩個子視圖?

如果我有一個不可編輯的NSTextField作爲contentView,那麼mouseDown:和mouseDragged:事件就會傳遞到它的超級視圖而沒有問題,並且拖動工作得很好。

mouseDown: ---> [NSTextField] ---> [Frame] 
mouseDragged: ---> [NSTextField] ---> [Frame] 

如果內容查看是一個NSView的子類,又包含了許多NSTextFields中的mouseDragged的:不從NSTextFields到上海華傳遞事件。

mouseDown: ---> [NSTextField] ---> [subclassed NSView] ---> [Frame] 
mouseDragged: ---> [NSTextField] -x-> 

mouseDown:event被幀接收。單擊NSTextFields之間的間隙並直接拖動contentView即可正常工作。

的NSTextFields設置了這樣的內容查看:

NSTextField *textfield = [[NSTextField alloc] initWithFrame:rect]; 
[textfield setBordered:NO]; 
[textfield setSelectable:NO]; 
[textfield setEditable:NO]; 
[textfield setTextColor:[NSColor blackColor]]; 
[textfield setBackgroundColor:[NSColor clearColor]]; 
[textfield setDrawsBackground:NO]; 
[textfield setAlignment:NSRightTextAlignment]; 
[textfield setFont:[NSFont fontWithName:@"Helvetica" size:14]]; 
[self addSubview:textfield]; 
[textfield release]; 

我曾嘗試加入的mouseDragged:方法既子類的NSTextField和子類的NSView,以及留法出來。兩者都沒有改變。對於處於相同子視圖級別的其他NSControl也存在此問題。

- (void)mouseDragged:(NSEvent *)theEvent 
{ 
    [super mouseDragged:theEvent]; 
} 

- (void)mouseDragged:(NSEvent *)theEvent 
{ 
    [self.superview mouseDragged:theEvent]; 
} 

目前這種行爲似乎完全不直觀的給我。有什麼我失蹤? (我在Mountain Lion上使用Xcode 4.6.2。)

回答

0

好的,我找到了答案。它與任何NSTextFields切斷任何鼠標事件無關。當我點擊NSView時,會調用一個例程來檢查內容是否仍然準確。這將釋放所有子視圖並重新佈局整個視圖。這自然地切斷了相同子視圖(不存在的)的mouseDown事件中的任何拖動事件。

我通過檢查NSView是否已經被激活進行拖動來解決這個問題,我應該首先完成。所以,我的錯誤,沒有任何人可以解決沒有我的整個源代碼...

1

NSTextView對鼠標有特殊的處理。不確定NSTextField,但它可能表現出相同的行爲。例如,沒有mouseUp事件。 mouseDown事件進入本地循環(可能用於拖動內容)。您可以嘗試在您的類中覆蓋mouseDown,並調用NSView的mouseDown來避開NSTextField的鼠標。請參閱this SO question瞭解如何操作。

+0

我不知道我完全理解這種方法。如果NSTextField是移動的NSView的直接子視圖,拖動似乎工作正常。如果我介紹更深層次的問題,問題纔會開始。此外,由於NSTextField是NSResponder的子類,不會像我原來的問題中提到的那樣覆蓋mouseDown/mouseDragged/mouseUp來解決它嗎? – 2013-04-21 04:18:59

+0

看來,如果我覆蓋mouseDown:在NSTextField中,不要調用mouseDown:在任何其他視圖中,mouseDragged:和mouseUp:都會被調用併發送到超級視圖。當然,在這種情況下,我無法啓動拖動。 – 2013-04-21 05:48:15

+0

我試着從鏈接中實現你的提示,但是應用程序與「地址不包含指向對象文件中的節的節」的通知一起墜毀。我的mouseDown代碼是: '方法nsviewMouseDownMethod = class_getClassMethod([NSResponder class],@selector(mouseDown :)); IMP mouseDownImplememtation = method_getImplementation(nsviewMouseDownMethod); mouseDownImplememtation(self.superview,@selector(mouseDown :));' – 2013-04-21 05:52:28

相關問題