2015-02-23 72 views
1

我有一個NSBox,並在NSBox內是一個NSImageView來顯示佔位符圖片。我創建了一個自定義類,NSBox的子類,並使其接受拖動我想要的文件。但是當我拖過NSBox裏面的NSImageView時,它會退出拖拽區域,我不能放下任何東西。使NSImageView和NSBox使用拖放相同的實現

我想能夠告訴NSBox和NSImageView使用我的拖動實現,這樣我就不必在兩個不同的類之間複製和粘貼代碼。

我還沒找到辦法做到這一點呢。

我的理解是類別只能擴展一個特定的類,所以這是行不通的。

而且當測試Composition時,我還沒有發現任何可以工作的東西。

而構成已被棄用,因爲我不會嘗試。

我的想法是創建一個類,NSView的子類,並把所有的con放在那個類的實現中,然後嘗試以某種方式在我的NSBox和NSImageView中繼承那個類。就像下面的插圖(當然不是實際的代碼,只是爲了說明我正在嘗試做什麼)。

@interface MyClass : NSView <NSDraggingDestination> 

@end 

@interface MyClassBox : NSBox (Inherit implementation from MyClass) 

@end 

@interface MyClassImageView : NSImageView (Inherit implementation from MyClass) 

@end 

回答

1

我已經在DND.m文件下面的代碼,我在的NSView#包括(/的NSControl)的子類,其我要添加將-N-掉落支持:

#pragma mark - NSDraggingDestination protocol methods 

// ------------------------------------------------------ 
// method called whenever a drag enters our drop zone 
// ------------------------------------------------------ 
- (NSDragOperation) draggingEntered:(id <NSDraggingInfo>)sender { 
    NSDragOperation result = NSDragOperationNone; 

    id delegate = self.window.windowController; 
    delegate = delegate ? delegate : self.window.delegate; 
    if (delegate && [delegate respondsToSelector:_cmd]) { 
     result = [delegate draggingEntered:sender]; 
    } 

    return (result); 
} // draggingEntered 

// ------------------------------------------------------ 
// method called whenever a drag exits our drop zone 
// ------------------------------------------------------ 
- (void) draggingExited:(id <NSDraggingInfo>)sender { 
    id delegate = self.window.windowController; 
    delegate = delegate ? delegate : self.window.delegate; 
    if (delegate && [delegate respondsToSelector:_cmd]) { 
     [delegate draggingExited:sender]; 
    } 
} // draggingExited 

// ------------------------------------------------------ 
// method to determine if we can accept the drop 
// ------------------------------------------------------ 
- (BOOL) prepareForDragOperation:(id <NSDraggingInfo>)sender { 
    BOOL result = NO; 

    id delegate = self.window.windowController; 
    delegate = delegate ? delegate : self.window.delegate; 
    if (delegate && [delegate respondsToSelector:_cmd]) { 
     result = [delegate prepareForDragOperation:sender]; 
    } 

    return (result); 
} // prepareForDragOperation 

// ------------------------------------------------------ 
// method that should handle the drop data 
// ------------------------------------------------------ 
- (BOOL) performDragOperation:(id <NSDraggingInfo>)sender { 
    BOOL result = NO; 

    id delegate = self.window.windowController; 
    delegate = delegate ? delegate : self.window.delegate; 
    if (delegate && [delegate respondsToSelector:_cmd]) { 
     result = [delegate performDragOperation:sender]; 
    } 

    return (result); 
} // performDragOperation 

我然後使用真實(共享)Drag-N-Drop代碼在窗口控制器或委託(子)類中實現這些相同的方法。

+0

謝謝,這工作得很好! – 2015-02-27 04:55:12