Перетаскивание (<NSDraggingDestination>) в Какао не работает
Я хочу реализовать некоторые "простые" перетаскивания в моем приложении Mac. Я перетащил в представление и соответственно ввел "MyView" в мой файл пера. Однако я не получаю никакого ответа в своей консоли (я пытаюсь регистрировать сообщения всякий раз, когда какой-либо из методов протокола запущен)
Я подкласса NSView, как это:
@interface MyView : NSView <NSDraggingDestination>{
NSImageView* imageView;
}
и реализовать это так:
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self registerForDraggedTypes:[NSImage imagePasteboardTypes]];
NSRect rect = NSMakeRect(150, 0, 400, 300);
imageView = [[NSImageView alloc] initWithFrame:rect];
[imageView setImageScaling:NSScaleNone];
[imageView setImage:[NSImage imageNamed:@"test.png"]];
[self addSubview:imageView];
}
return self;
}
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{
NSLog(@"entered");
return NSDragOperationCopy;
}
- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender{
return NSDragOperationCopy;
}
- (void)draggingExited:(id <NSDraggingInfo>)sender{
NSLog(@"exited");
}
- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender{
NSLog(@"som");
return YES;
}
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
NSPasteboard *pboard = [sender draggingPasteboard];
if ( [[pboard types] containsObject:NSURLPboardType] ) {
NSURL *fileURL = [NSURL URLFromPasteboard:pboard];
NSLog(@"%@", fileURL);
}
return YES;
}
- (void)concludeDragOperation:(id <NSDraggingInfo>)sender{
NSLog(@"conclude sth");
}
- (void)draggingEnded:(id <NSDraggingInfo>)sender{
NSLog(@"ended");
}
- (BOOL)wantsPeriodicDraggingUpdates{
NSLog(@"wants updates");
}
- (void)updateDraggingItemsForDrag:(id <NSDraggingInfo>)sender NS_AVAILABLE_MAC(10_7){
}
1 ответ
Если кому-то еще это нужно, используйте:
[self registerForDraggedTypes:[NSArray arrayWithObjects:
NSFilenamesPboardType, nil]];
вместо:
[self registerForDraggedTypes:
[NSImage imagePasteboardTypes]]; // BAD: dropped image runs away, no draggingdestination protocol methods sent...
решил эту проблему для меня. Я подозреваю, что это работает, потому что мой XIB нацелен на osX 10.5. NSFilenamesPboardType представляет UTI со стандартными данными 10,5 и более ранних версий, а [NSImage imagePasteboardTypes] возвращает UTI со стандартными данными 10,6 и более поздних версий.
Кстати, в отправителе - (BOOL) executeDragOperation:(id NSDraggingInfo) вы можете получить путь к файлу, который был удален с помощью:
NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
Получил решение здесь: