Простое приложение перетаскивания не работает
Я пытаюсь простое приложение перетаскивания:
- Я создаю CameraIconView (подкласс NSView, содержащий некоторые изображения, текстовые поля и всплывающую кнопку) во время выполнения.
- Это представление заключено в CameraIconEnclosingBox (подкласс NSBox)
- Требование: пользователь должен иметь возможность перетаскивать CameraIconView в другое место в CameraIconEnclosingBox.
Для реализации моих требований я делаю это:
- Реализован следующий метод в классе 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 ответ
Я могу решить эту проблему, добавив следующую строку кода:
[self addSubview:object];
перед этим кодом:
[object setFrame:NSMakeRect(x, y, width, height)];
Поэтому CameraIconView теперь появляется в удаленном месте.:)
... но теперь я сталкиваюсь с новой проблемой -
каждый раз, когда CameraIconView перетаскивается и отбрасывается, он не перемещает перетаскиваемый CameraIconView в новое местоположение, а создает и показывает новый экземпляр в CameraIconEnclosingBox в новом месте, т.е. для первого перетаскивания два значка начинают появляться для того же CameraIconView... для второго перетаскивания три значка начинают появляться и так далее....
Может кто-нибудь предложить мне какой-нибудь способ решить это?
Спасибо,
Miraaj