Получение перетаскивает операции

Этот документ показывает пример кода, позволяющий представлению (или окно) принимать сеансы перетаскивания для нескольких типов данных, выполняя различные операции перетаскивания на основе перетащенного типа. Демонстрационная реализация может принять или цвет или файл. В то время как файл будет или соединен или скопирован, будет скопирован перетащенный цвет.

Прежде чем представление может получить работу перетаскивания, необходимо зарегистрировать типы данных, которые оно может принять путем вызова registerForDraggedTypes:, как это:

[self registerForDraggedTypes:[NSArray arrayWithObjects:
            NSColorPboardType, NSFilenamesPboardType, nil]];

Теперь, любое время, сеанс перетаскивания, состоящий из любого из этих типов данных, вводит границы представления, представление, отправляется ряд сообщений NSDraggingDestination. Код ниже является простым примером начального метода, отправляющегося: draggingEntered:. Метод получает область монтажа перетаскивания и доступные операции перетаскивания от объекта отправителя. Если область монтажа содержит цветные данные, и исходный объект разрешает перетаскивать, возвраты метода NSDragOperationGeneric, указание, что место назначения разрешает перетаскивать цветных данных по области монтажа. Если область монтажа содержит имя файла, и исходный объект разрешает соединяться, возвраты метода NSDragOperationLink, указание, что место назначения разрешает ссылку. Если источник не позволяет соединяться, место назначения также проверяет, позволяется ли работа копии вместо этого, возвращаясь NSDragOperationCopy раз так. Не проходя все эти тесты, возвраты метода NSDragOperationNone.

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard;
    NSDragOperation sourceDragMask;
 
    sourceDragMask = [sender draggingSourceOperationMask];
    pboard = [sender draggingPasteboard];
 
    if ( [[pboard types] containsObject:NSColorPboardType] ) {
        if (sourceDragMask & NSDragOperationGeneric) {
            return NSDragOperationGeneric;
        }
    }
    if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
        if (sourceDragMask & NSDragOperationLink) {
            return NSDragOperationLink;
        } else if (sourceDragMask & NSDragOperationCopy) {
            return NSDragOperationCopy;
        }
    }
    return NSDragOperationNone;
}

Поскольку сеанс перетаскивания продолжается, место назначения отправляется draggingUpdated: сообщения. Только необходимо реализовать это, если место назначения должно знать, что текущая позиция перетащенного изображения, или изменяет работу перетаскивания или обновляет какую-либо визуальную обратную связь, такую как точка вставки, Вы обеспечиваете. Если не реализованный, NSView предполагает, что работа перетаскивания неизменна от draggingEntered: вызов. Если сеанс перетаскивания оставляет границы представления, draggingExited: метод вызывается. Реализуйте это, если необходимо очистить после одного из предыдущих сообщений, таких как удаление визуальной обратной связи.

Когда изображение отбрасывается с работой перетаскивания кроме NSDragOperationNone, место назначения отправляется a prepareForDragOperation: сообщение, сопровождаемое performDragOperation: и concludeDragOperation:. Можно отменить перетаскивание путем возврата NO от любого из первых двух методов.

Вы выполняете в объеме обработки данных performDragOperation: метод; другие два метода реализованы только если необходимый. Следующий пример кода показывает возможную реализацию этого метода. Метод снова проверяет область монтажа на доступные данные и, при необходимости, это также проверяет маску работы источника перетаскивания на доступные операции.

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard;
    NSDragOperation sourceDragMask;
 
    sourceDragMask = [sender draggingSourceOperationMask];
    pboard = [sender draggingPasteboard];
 
    if ( [[pboard types] containsObject:NSColorPboardType] ) {
        // Only a copy operation allowed so just copy the data
        NSColor *newColor = [NSColor colorFromPasteboard:pboard];
        [self setColor:newColor];
    } else if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
        NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
 
        // Depending on the dragging source and modifier keys,
        // the file data may be copied or linked
        if (sourceDragMask & NSDragOperationLink) {
            [self addLinkToFiles:files];
        } else {
            [self addDataFromFiles:files];
        }
    }
    return YES;
}