2011-11-24 46 views
2

我有一個應用程序,其中有一個從NSView派生的自定義視圖。 在這個視圖中,有幾個自定義子視圖,它們也是從NSView派生的。將拖放事件轉發到父視圖

我想實現一個拖放行爲,允許將URL拖放到視圖上。一切都已經在爲主要觀點工作。

所以,實際上我必須在子視圖和父視圖類上實現拖動行爲處理程序。 問題是,我不想將完整的處理代碼複製到所有子視圖,以使它們也接受拖動事件。所以我認爲這將是讓他們將所有拖動事件轉發給父視圖的最佳方式。

這是可能以某種方式?不知道我是否可以以響應者鏈的方式設置它?

任何提示都非常感謝! 在此先感謝。

回答

3

我遇到過類似的問題,我希望在視圖中放入任何東西,或者它的任何子視圖都要被視圖處理,但是調用永遠不會到達那裏。

經過一番研究,我發現這個答案是最有幫助的:https://stackoverflow.com/a/7389711/327471

從本質上講,如果一個觀點沒有登記接收任何拖動事件應當將該信息傳遞到它的自動父視圖。所以在我的情況下,我結束了這樣的事情:

NSArray *subviews = [self.view subviews]; 
for (NSView *aSubview in subviews) { 
    [aSubview unregisterDraggedTypes]; 
} 

當然,你可以比這更精確,並確保只檢查某種類型或你想要的任何參數的子類。但最終關鍵是從拖動類型中註銷問題子視圖。

我希望這會有所幫助。

+0

這看起來完全是我所需要的!今晚會嘗試!你的時間很棒。還有其他問題需要解決,我昨天完成了最後一個問題。所以我很快就會提出一個關於這個確切主題的新問題。謝謝。讓我的一天! – guitarflow

+0

嘗試過後,我認爲它沒有工作......直到我發現,我的自定義視圖包含一個NSImageView,它顯示一個陰影圖像作爲整個視圖的疊加層。這吃了我所有的拖動事件。 'unregisterDraggedType'解決了我的問題。非常感謝你!! – guitarflow

2

如果僅用於顯示的子視圖,並且不需要任何用戶交互,可以覆蓋在父視圖-hitTest:像這樣:

- (NSView *)hitTest:(NSPoint)aPoint 
{ 
    NSView* hitView = [super hitTest:aPoint]; 
    if(hitView) 
     return self; 
    return nil; 
} 

這使得父視圖接收所有的鼠標事件。

+0

不幸的是,我的孩子的意見也接受鼠標點擊事件。任何其他想法? – guitarflow

+0

您可以單獨傳播鼠標單擊事件,方法是在父視圖中重寫mouseUp:並在其中一個子視圖的矩形內傳播。不是很優雅:) –

0

可能有更好的方法,但是可以將拖動協議實現放在類別中,而不是直接放在視圖中,並在每個視圖中包含該類別。