2015-02-23 62 views
1

我有一个NSBox,并在NSBox内是一个NSImageView来显示占位符图片。我创建了一个自定义类,NSBox的子类,并使其接受拖动我想要的文件。但是当我拖过NSBox里面的NSImageView时,它会退出拖拽区域,我不能放下任何东西。使NSImageView和NSBox使用拖放相同的实现

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

回答

1

我已经在DND.m文件下面的代码,我在的NSView#包括(/的NSControl)的子类,其我要添加将-N-掉落支持:

#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代码在窗口控制器或委托(子)类中实现这些相同的方法。

+0

谢谢,这工作得很好! – 2015-02-27 04:55:12