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 が呼び出されないのはなぜですか? 私はすべての pboard タイプなどを使用しようとしました。何も機能していないようです。また、registerForDraggedTypes を [self] ビューで動作するように変更しました。ボックスはキャンバスのサブビューです。

ブルース

4

2 に答える 2

4

プログラムでビューを追加している (つまり、Nib 経由で追加していない) ため、awakeFromNib が registerForDragTypes 呼び出しを置く場所として間違っていることがわかりました。呼び出しを 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

ブルース、

あなたのコードは以下の方法で変更する必要があります。メソッド dragEntered が呼び出されるようにするには、ビューをドラッグタイプに登録する必要があると思います。

@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. NSBox を Xib にドラッグ アンド ドロップし、NSBox のクラスを NSModifiedBox に変更します。
  2. メソッド「draggingEntered」にブレークポイントを設定します。
  3. 「.png」または「.gif」ファイルをドラッグして NSModifiedBox にドロップすると、「draggingEntered」が呼び出されることがわかります
  4. または、「draggingEntered」内でも NSLog を使用して確認できます。

私の答えがあなたに役立つことを願っています:)

于 2013-06-14T10:10:54.030 に答える