【问题标题】:Make both NSImageView and NSBox use the same implementation for Drag&Drop让 NSImageView 和 NSBox 使用相同的拖放实现
【发布时间】:2015-02-23 12:33:10
【问题描述】:

我有一个 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

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    我在我想要添加拖放支持的 NSView(/NSControl) 子类中#include 的 DND.m 文件中有以下代码:

    #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
    

    然后,我在窗口控制器或委托(子)类中使用真实(共享)拖放代码实现这些相同的方法。

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多