首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使NSImageView和NSBox对拖放使用相同的实现

使NSImageView和NSBox对拖放使用相同的实现
EN

Stack Overflow用户
提问于 2015-02-23 12:33:10
回答 1查看 139关注 0票数 1

我有一个NSBox,在NSBox中有一个显示占位符图片的NSImageView。我已经创建了一个自定义类NSBox的子类,并让它接受拖动我想要的文件。但是,当我在NSImageView上拖动NSBox时,它会退出拖动区域,我不能在那里丢弃任何东西。

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

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

我的理解是,类别只能扩展特定的类,所以这是行不通的。

在测试作文时,我也没有发现任何有用的东西。

摆姿势已经很久了,所以我不想尝试了。

我的想法是创建一个类,NSView的子类,并将所有con放在该类实现中,然后尝试在我的NSBox和NSImageView中继承该类。就像下面的例子(当然不是实际代码,只是为了说明我想要做的事情)。

代码语言:javascript
复制
@interface MyClass : NSView <NSDraggingDestination>

@end

@interface MyClassBox : NSBox (Inherit implementation from MyClass)

@end

@interface MyClassImageView : NSImageView (Inherit implementation from MyClass)

@end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-24 17:25:24

我在DND.m文件中有以下代码,我将它#包括在NSView(/NSControl)子类中,我想向其中添加拖放支持:

代码语言:javascript
复制
#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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28673922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档