使NSImageView和NSBox对Drag& Drop使用相同的实现

时间:2015-02-23 12:33:10

标签: objective-c cocoa

我有一个NSBox,在NSBox内部是一个NSImageView来显示占位符图片。我创建了一个自定义类,NSBox的子类,并使其接受拖动我想要的文件。但是当我拖动NSBox内部的NSImageView时,它会退出拖动区域而我无法丢弃任何内容。

我希望能够告诉NSBox和NSImageView使用我的拖动实现,这样我就不必在两个不同的类之间复制和粘贴代码。

我还没有办法做到这一点。

我的理解是,类别只能扩展特定的类,因此不会起作用。

在测试作品时,我还没有找到任何可行的作品。

Posing很快就被弃用了,所以我不会尝试。

我的想法是创建一个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 个答案:

答案 0 :(得分:1)

我在DND.m文件中有以下代码,我在NSView(/ NSControl)子类中包含#include,我想添加Drag-N-Drop支持:

#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代码实现这些相同的方法。