1

我有一个名为 dragBox 的 NSBox 子类。我希望能够将它拖到画布上。代码如下:

-(void) awakeFromNib
{
[[self superview] registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];


}
-(void) mouseDown:(NSEvent *)theEvent
{
   [self dragImage:[[NSImage alloc] initWithContentsOfFile:@"/Users/bruce/Desktop/Untitled-1.png"] at:NSMakePoint(32, 32)  offset:NSMakeSize(0,0) event:theEvent pasteboard:[NSPasteboard pasteboardWithName:NSDragPboard] source:self slideBack:YES];




}
-(NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender // validate
{
    NSLog(@"Updated");
    return [sender draggingSourceOperationMask];

}

-(NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
    NSLog(@"Drag Entered");

    return [sender draggingSourceOperationMask];

}
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {

NSLog(@"Move Box");
[self setFrameOrigin:[sender draggingLocation]];


return YES;
}

-(BOOL) prepareForDragOperation:(id<NSDraggingInfo>)sender
{NSLog(@"Prepared");
return YES;

}

为什么不调用dragEntered?我尝试使用所有的板类型等。似乎没有任何效果。我还将 registerForDraggedTypes 更改为仅使用 [self] 视图。该框是画布的子视图。

布鲁斯

4

2 回答 2

4

我发现 awakeFromNib 是放置我的 registerForDragTypes 调用的错误位置,因为我以编程方式添加我的视图(即不通过 Nib 添加它)。我不得不将调用放入 initWithFrame:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self registerForDraggedTypes: [NSArray arrayWithObjects:NSTIFFPboardType,NSFilenamesPboardType,nil]];
    }

    return self;
}
于 2013-11-09T22:52:21.360 回答
1

布鲁斯,

您的代码需要按以下方式更改。我相信应该为拖动类型注册视图,以使方法 draggingEntered 被调用。

@interface NSModifiedBox : NSBox

@end


@implementation NSModifiedBox
- (void)drawRect:(NSRect)dirtyRect
{
    // Drawing code here.
    [self registerForDraggedTypes:
     [NSArray arrayWithObjects:NSTIFFPboardType,NSFilenamesPboardType,nil]];
    [super drawRect:dirtyRect];
}


- (NSDragOperation)draggingEntered:(id )sender
{
    if ((NSDragOperationGeneric & [sender draggingSourceOperationMask])
        == NSDragOperationGeneric)
    {

        return NSDragOperationGeneric;

    } // end if

    // not a drag we can use
    return NSDragOperationNone;

} 

- (BOOL)prepareForDragOperation:(id )sender
{
    return YES;
} 
@end
  1. 现在在 Xib 上拖放一个 NSBox,并将 NSBox 的类修改为 NSModifiedBox。
  2. 为方法“draggingEntered”设置一个断点。
  3. 现在将“.png”或“.gif”文件拖放到 NSModifiedBox 上,您会看到“draggingEntered”将被调用
  4. 或者,您也可以在“draggingEntered”中使用 NSLog 进行检查。

希望我的回答能帮到你:)

于 2013-06-14T10:10:54.030 回答