我有一个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
答案 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代码实现这些相同的方法。