Принятие перетаскиваемых файлов в приложении Какао - PullRequest
9 голосов
/ 20 декабря 2011

У меня есть простое приложение, которое обрабатывает маркетинговую информацию.Я позвонил

NSInteger result  = [openPanel runModalForDirectory:nil file:nil types:fileTypes];

, когда пользователь нажимает на меню File->Open.Теперь меня попросили добавить возможности перетаскивания в приложение, чтобы пользователь мог вместо этого перетащить в него файл, когда ему нужно перейти в меню или нажать команду + o, чтобы открыть файл.

Прежде чем вы скажете мне прочитайте документацию Я уже проверил вступительное слово Apple, чтобы перетаскивать и другие документы.Тем не менее я не могу понять, что делать.

Я старый программист Unix C, которому нужно копировать с этим, и некоторые предположения в документе Apple не имеют смысла для меня.

Короче говоря, что мне нужно добавить в мое приложение:

  1. Включить перетаскивание
  2. Обработка перетаскиваемого файла

Как примечание, я должен обрабатывать только один файл за раз.

Спасибо за помощь

1 Ответ

16 голосов
/ 20 декабря 2011

Ну, вам нужно реализовать протокол NSDraggingDestination, который, как я полагаю, вы уже прочитали.Вы можете реализовать его либо в определенном виде, либо во всем окне - похоже, вы принимаете перетаскивание файлов на уровне приложения, поэтому вы, вероятно, хотите, чтобы все окно принимало перетаскивание.В любом случае, как только вы запустите его, вы увидите, как его настроить.

Подкласс NSWindow.Первый шаг - указать, какие типы перетаскивания вас интересуют.

Скажите вашему пользовательскому окну, что его интересуют имена файлов:

- (void)awakeFromNib {
    [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
}

Скажите OS X, какой тип курсора отображать:

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

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

Выполните перетаскивание:

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
    NSPasteboard *pboard = [sender draggingPasteboard];
    NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType];

    if (1 == filenames.count)
        if ([[NSApp delegate] respondsToSelector:@selector(application:openFile:)])
            return [[NSApp delegate] application:NSApp openFile:[filenames lastObject]];

    return NO;
}

Это самый необходимый минимум, чтобы заставить его работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...