Перетаскивание (<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];

Получил решение здесь:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DragandDrop/Tasks/acceptingdrags.html#//apple_ref/doc/uid/20000993-BABHHIHC

Другие вопросы по тегам