Способ работы моего приложения Какао состоит в том, чтобы иметь один подкласс NSView для каждого окна и много внутренних представлений, отображаемых внутри него. Недавно я перешел на использование функции NSD beginDraggingSessionWithItems: event: source для поддержки перетаскивания файловых обещаний во внешние приложения (например, Finder). Но внутренние типы перетаскивания (базовый тип String и Binary blob) необходимо было перенести из dragImage NSWindow. Основное различие, которое я заметил, заключается в том, что beginDraggingSessionWithItems по умолчанию не позволяет мне перетаскивать из моего приложения в мое приложение ... как во внутреннее устройство. Например, если у меня есть элемент управления деревом и я использую DnD для перемещения элементов, он не работает. Перетаскивание файлов в приложение работает. Перетаскивание обещаний из приложения работает. Просто ничего внутри.
Какой-то код. Вот где я создаю двоичный элемент:
auto drag_items = [[NSMutableArray alloc] init];
auto item = [[NSPasteboardItem alloc] init];
NSData *data = [NSData dataWithBytes:myBinary.Data length:myBinary.Length];
[item setData:data forType:dd.Format.NsStr()];
auto drag_item = [[NSDraggingItem alloc] initWithPasteboardWriter:item];
drag_item.draggingFrame = NSMakeRect(floor(position.x), floor(position.y), 32, 32);
[drag_items addObject:drag_item];
и затем начинаю перетаскивание:
NSDraggingSession *session = [myNsWindow.contentView beginDraggingSessionWithItems:drag_items
event:myEvent
source:DragSrc];
Источник перетаскивания реализует draggingSession так:
- (NSDragOperation)draggingSession:(nonnull NSDraggingSession *)session
sourceOperationMaskForDraggingContext:(NSDraggingContext)context
{
switch (context)
{
case NSDraggingContextOutsideApplication:
return NSDragOperationCopy;
case NSDraggingContextWithinApplication:
return NSDragOperationCopy | NSDragOperationGeneric | NSDragOperationMove;
default:
return NSDragOperationNone;
}
}
Полный исходный код для перетаскивания доступен в GDragAndDrop.mm , а полный целевой код перетаскивания доступен в LCocoaView.mm .
. Я вижу, что ни один из Вызываются целевые методы перетаскивания, и когда я отпускаю мышь, изображение возвращается к источнику перетаскивания.
Я помню, что есть флаг или что-то, что можно установить, чтобы один и тот же вид был одновременно источник и цель. Но по жизни я не могу его найти.
Редактировать: это типы, которые я передаю в регистр NSViewForForDraggedTypes:
"public.item"
"com.apple.NSFilePromiseItemMetaData"
"dyn.ah62d4rv4gu8yc6durvwwa3xmrvw1gkdusm1044pxqyuha2pxsvw0e55bsmwca7d3sbwu"
"com.apple.pasteboard.promised-file-content-type"
Я думаю, что происходит, зарегистрированные типы не соответствовать тому, что я пытаюсь перетащить. То, что я хочу, это подстановочный знак, так что получатель получает все типы, и я делаю фильтрацию на более низком уровне. Вот почему в списке есть «publi c .item», но он работает не так, как я задумал.