Перетаскивание: NSView думает, что источник - это изображение, которого нет

У меня два взгляда. 1. Один вид имеет сетку NSImageViews с изображениями. 2. Другой вид имеет сетку потенциальных мест для размещения перетаскиваемого изображения.

Я думаю, что у меня есть работа перетаскивания. Если я щелкаю и перетаскиваю изображение из вида 1, оно работает нормально, но когда я пытаюсь его разместить, путь к исходному изображению относится к изображению на моем рабочем столе, которое даже не является частью моего проекта. Результат приведенного ниже кода - carryData = nil, но я провел некоторое тестирование с NSLog и увидел, что он отправляет путь к изображению вне проекта, который не является моим рабочим столом.

Вот некоторые из методов протокола D&D, которые я реализовал. myDragState - это просто перечисление, которое я использую для выделения пространства сетки, над которым в данный момент находится перетаскивание.

в Инициативе...

[self registerForDraggedTypes:[NSImage imagePasteboardTypes]];
myDragState = dragStateNone;

Тогда методы протокола

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{

    if ((NSDragOperationGeneric & [sender draggingSourceOperationMask]) == NSDragOperationGeneric)
    {
        myDragState = dragStateOver;
        [self setNeedsDisplay];

        return NSDragOperationGeneric;
    }
    else
    {
        return NSDragOperationNone;
    }
}

- (void)draggingExited:(id <NSDraggingInfo>)sender
{
    //turn off focus ring
    myDragState = dragStateExited;
    [self setNeedsDisplay];

}

- (void)draggingEnded:(id <NSDraggingInfo>)sender { }

- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
{
    return YES;
}

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
{
    NSPasteboard *paste = [sender draggingPasteboard];
    //gets the dragging-specific pasteboard from the sender
    NSArray *types = [NSArray arrayWithObjects:NSTIFFPboardType, nil];
    //a list of types that we can accept
    NSString *desiredType = [paste availableTypeFromArray:types];
    NSData *carriedData = [paste dataForType:desiredType];

    if (nil == carriedData)
    {
        //the operation failed for some reason
        NSRunAlertPanel(@"Paste Error", @"Sorry, but the past operation failed", nil, nil, nil);

        myDragState = dragStateNone;
        [self setNeedsDisplay];

        return NO;
    }
    else
    {
        //the pasteboard was able to give us some meaningful data
        if ([desiredType isEqualToString:NSTIFFPboardType])
        {
            NSLog(@"TIFF");
            //we have TIFF bitmap data in the NSData object
            NSImage *newImage = [[NSImage alloc] initWithData:carriedData];
            [self setImage:newImage];

            myDragState = dragStateSet;
        }
        else
        {
            //this can't happen
            //NSAssert(NO, @"This can't happen");
            NSLog(@"Other type");
            myDragState = dragStateNone;
            [self setNeedsDisplay];
            return NO;
        }
    }
    //redraw us with the new image
    return YES;
}

- (void)concludeDragOperation:(id <NSDraggingInfo>)sender
{
    //re-draw the view with our new data
    [self setNeedsDisplay:YES];
}

- (void)drawRect:(NSRect)dirtyRect
{
    // Drawing code here.
    NSRect ourBounds = [self bounds];

    if (myDragState == dragStateSet)
    {
        NSImage *image = [self image];
        [super drawRect:dirtyRect];
        [image compositeToPoint:(ourBounds.origin) operation:NSCompositeSourceOver];
    }
    else if (myDragState == dragStateOver)
    {
        [[NSColor colorWithDeviceRed:1.0f green:1.0f blue:1.0f alpha:0.4f] set];
        [NSBezierPath fillRect:ourBounds];
    }
    else {
        //draw nothing
    }

}

Редактировать: Итак, я понял это. Проблема была на самом деле с источником. Я не копировал это на PBoard должным образом. Мой код для этого:

NSPasteboard *zPasteBoard = [NSPasteboard pasteboardWithName:NSDragPboard]; 
[zPasteBoard declareTypes:[NSArray arrayWithObject:NSTIFFPboardType] owner:self]; 
[zPasteBoard setData:[tileImageView.image TIFFRepresentation] forType:NSTIFFPboardType];

Теперь я получаю странный эффект, когда изображения показывают. Поскольку изображения помещаются в конечный вид изображения, их размер изменяется, но более крупная версия с перетаскиванием также все еще отображается. Итак, я получаю два изображения на изображении.

0 ответов

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