我有一个NSBox,在NSBox中有一个显示占位符图片的NSImageView。我已经创建了一个自定义类NSBox的子类,并让它接受拖动我想要的文件。但是,当我在NSImageView上拖动NSBox时,它会退出拖动区域,我不能在那里丢弃任何东西。
我希望能够告诉NSBox和NSImageView使用我的拖放实现,这样我就不必在两个不同的类之间复制和粘贴代码。
我还没有找到办法来做到这一点。
我的理解是,类别只能扩展特定的类,所以这是行不通的。
在测试作文时,我也没有发现任何有用的东西。
摆姿势已经很久了,所以我不想尝试了。
我的想法是创建一个类,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发布于 2015-02-24 17:25:24
我在DND.m文件中有以下代码,我将它#包括在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然后,在窗口控制器或委托(子)类中使用实际(共享)拖放代码实现这些相同的方法。
https://stackoverflow.com/questions/28673922
复制相似问题