Какао NSView subview блокирует перетаскивание - PullRequest
10 голосов
/ 05 мая 2011

У меня есть подкласс NSView, который регистрирует файлы для перетаскивания в методе инициализации следующим образом:

    [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];

Перетаскивание работает отлично, но если я добавлю подпредставление для этого представления с точно такой же рамкой, оно больше не будет работать. Я предполагаю, что подпредставление блокирует событие перетаскивания, чтобы перейти в супер-просмотр. Могу ли я избежать этого? Спасибо

Кроме того, я знаю, что задаю два вопроса, но я не хочу создавать новую тему только для этого: когда я перетаскиваю, мой курсор не меняется на знак "+", как с другими перетаскиваниями, Как мне это сделать? Еще раз спасибо.

UPDATE: Вот как я настроил его в моем IB: enter image description here

DrawView - это пользовательский класс, о котором я говорил, который зарегистрирован для перетаскиваемых типов. А представление «Изображение» - это просто подпредставление, я перетащил изображение из раздела «Медиа» ... Если это поможет, вот мой соответствующий код для DragView:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
    return NSDragOperationCopy;
}

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard;
    pboard = [sender draggingPasteboard];
    NSArray *list = [pboard propertyListForType:NSFilenamesPboardType];
    if ([list count] == 1) {
        BOOL isDirectory = NO;
        NSString *fileName = [list objectAtIndex:0];
        [[NSFileManager defaultManager] fileExistsAtPath:fileName
                                             isDirectory: &isDirectory];
        if (isDirectory) {
            NSLog(@"AHH YEA");
        } else {
            NSLog(@"NOO");
        }
    }
    return YES;
}

1 Ответ

4 голосов
/ 05 мая 2011

Ответ на вторую часть вашего вопроса таков:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{
    return NSDragOperationCopy;
}

если вы вернете NSDragOperationCopy, вы получите значок мыши для операции копирования.(Вы можете и должны, конечно, не просто вернуть NSDragOperationCopy безоговорочно; проверьте объекты на монтажном столе, чтобы увидеть, можете ли вы их принять.)

Я не уверен, что ответ на первую частьвопрос в том, что я не могу воссоздать эффект блокировки подпредставления.

Хорошо, к сожалению, вы не можете ответить.Перетаскиваемое изображение содержится в NSImageView, а NSImageView сами принимают события перетаскивания, поэтому оно захватывает событие перетаскивания и ничего с ним не делает.Если ваше подпредставление было пользовательским классом, вы могли бы либо a) не реализовывать перетаскивание, в этом случае перетаскивания будут проходить через ;б) реализовать перетаскивание, чтобы принимать перетаскивания для подпредставления.В этом случае вы используете класс, который вы не можете контролировать.Если все, что вам нужно, это отобразить изображение, вы сможете создать еще один NSView подкласс, который ничего не делает, но рисует изображение в drawRect:

.
...