0

シンプルなドラッグ アンド ドロップ アプリケーションを試しています。

  1. 実行時に CameraIconView (いくつかの画像ビュー、テキスト フィールド、およびポップアップ ボタンを含む NSView のサブクラス) を作成しています。
  2. このビューは CameraIconEnclosingBox (NSBox のサブクラス) に囲まれています。
  3. 要件: ユーザーは CameraIconView を CameraIconEnclosingBox の別の場所にドラッグできる必要があります。

私の要件を実装するために、私はこれを行っています:

  1. CameraIconView クラスに次のメソッドを実装しました。

-(void)mouseDown:(NSEvent *)e{

    NSPoint location; 
    NSSize size;
    NSPasteboard *pb = [NSPasteboard pasteboardWithName:@"CameraIconContainer"];

    location.x =  ([self bounds].size.width - size.width)/2;
    location.y =  ([self bounds].size.height - size.height)/2;

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self];
    [pb declareTypes:[NSArray arrayWithObject:IconDragDataType] owner:self];
    [pb setData:data forType:IconDragDataType];
    [self dragImage:[NSImage imageNamed:@"camera_icon.png"] at:location offset:NSZeroSize event:e pasteboard:pb source:self slideBack:NO];
}

2. CameraIconEnclosingBox クラスに次のメソッドを実装-

- (void)awakeFromNib{
    [self registerForDraggedTypes:[NSArray arrayWithObject:IconDragDataType]];
}
- (NSDragOperation)draggingEntered:(id < NSDraggingInfo >)sender{
    return NSDragOperationEvery;
}
- (BOOL)performDragOperation:(id < NSDraggingInfo >)sender{
    return YES;
}
- (void)concludeDragOperation:(id < NSDraggingInfo >)sender{
    NSPoint dropLocation = [sender draggingLocation];

    float x = dropLocation.x;
    float y = dropLocation.y;
    NSLog(@"dragOperationConcluded! draggingLocation: (%f, %f)",x,y);

    NSPasteboard *pb = [sender draggingPasteboard];
    NSLog(@"Pasteboard name- %@",[pb name]);
    NSData *draggedData = [pb dataForType:IconDragDataType];

    CameraIconView *object = [NSKeyedUnarchiver unarchiveObjectWithData:draggedData];
    NSLog(@"object - %@ / cameraNo : %@/ operatorName : %@",object,[[object cameraNo] stringValue],[[object operatorName] stringValue]);
    // the cameraNo and operatorName are properties defined within CameraIconView class
    // the above log is returning (null) for both properties

    float width  = [object frame].size.width;
    float height = [object frame].size.height;

    NSLog(@"width - %f / height - %f",width,height);
    [object setFrame:NSMakeRect(x, y, width, height)];
}

これらのメソッドを実装した後、CameraIconEnclosingBox のすべてのドラッグ デリゲート メソッドが呼び出されますが、ドラッグを実行できますが、ドロップ操作は機能しません。

私が間違っている可能性がある場所や、要件を実装するための他のより良い方法を誰かが提案できますか?

ありがとう、

ミラージュ

4

1 に答える 1

0

次のコード行を追加することで解決できます。

[self addSubview:object];

このコードの前に:

[object setFrame:NSMakeRect(x, y, width, height)];

そのため、ドロップされた場所に CameraIconView が表示されるようになりました。:)

...しかし、今、私は新たな問題に直面しています-

CameraIconView がドラッグ アンド ドロップされるたびに、ドラッグされた CameraIconView が新しい場所に配置されるのではなく、新しい場所で CameraIconEnclosingBox 内に新しいインスタンスが作成されて表示されます。最初のドラッグ アンド ドロップでは、同じ CameraIconView に対して 2 つのアイコンが表示され始めます... 2 回目のドラッグ アンド ドロップでは、3 つのアイコンが表示され始めます....

誰かがそれを解決する方法を提案できますか?

ありがとう、

ミラージ

于 2010-07-15T07:07:58.140 に答える