gpt4 book ai didi

objective-c - 使 NSImageView 和 NSBox 使用相同的拖放实现

转载 作者:行者123 更新时间:2023-12-03 17:11:01 26 4
gpt4 key购买 nike

我有一个NSBox,NSBox内部有一个NSImageView来显示占位图片。我创建了一个自定义类(NSBox 的子类),并使其接受拖动我想要的文件。但是当我拖动 NSBox 内的 NSImageView 时,它会退出拖动区域,并且我无法在那里放置任何东西。

我希望能够告诉 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

最佳答案

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

#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

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

关于objective-c - 使 NSImageView 和 NSBox 使用相同的拖放实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28673922/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com