Простое приложение перетаскивания не работает - PullRequest
0 голосов
/ 14 июля 2010

Я пробую простое приложение перетаскивания:

  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 вызываются.

Кто-нибудь может подсказать, где я могу ошибаться или какой-нибудь другой лучший способ реализовать мои требования?

Спасибо

Miraaj

1 Ответ

0 голосов
/ 15 июля 2010

Я могу решить эту проблему, добавив следующую строку кода:

[self addSubview:object];

перед этим кодом:

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

Таким образом, CameraIconView теперь отображается в удаленном месте.:)

... но теперь я сталкиваюсь с новой проблемой -

каждый раз, когда CameraIconView перетаскивается, он не позиционирует перетащенный CameraIconView на новое место, носоздает и показывает новый экземпляр в CameraIconEnclosingBox в новом месте, т.е.для первого перетаскивания две иконки начинают появляться для одного и того же CameraIconView ... для второго перетаскивания три иконки начинают появляться и так далее ...

Может кто-нибудь предложить мне какой-то способ решенияэто?

Спасибо,

Miraaj

...