Чтение нескольких перетаскиваемых файлов

У меня есть небольшое окно внутри основного xib (MainMenu.xib) с элементом управления NSImageView для приложения OS X. Этот элемент управления представлением имеет подкласс NSImageView, который должен принимать файлы, которые приносит пользователь (перетаскивание). Поскольку у меня нет опыта разработки приложений для Mac с помощью Objective-C, я поискал, проверил несколько примеров проектов от Apple и получил некоторую идею. Короче говоря, я только что скопировал код, опубликованный здесь. Оно работает. Отлично... Ниже приведена краткая версия.

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

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

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

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

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
    NSPasteboard *pboard = [sender draggingPasteboard];
    if ([[pboard types] containsObject:NSURLPboardType]) {
        NSURL *fileURL = [NSURL URLFromPasteboard:pboard];
        NSLog(@"Path: %@", [self convertPath:fileURL]); // <== That's just what I need
    }
    return YES;
}

- (NSString *)convertPath:(NSURL *)url {
    return url.path;
}

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

Спасибо,


person El Tomato    schedule 08.05.2013    source источник


Ответы (2)


Измените метод PerformDragOperation: на это:

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
    NSPasteboard *pboard = [sender draggingPasteboard];
    if ([[pboard types] containsObject:NSURLPboardType]) {
        NSArray *urls = [pboard readObjectsForClasses:@[[NSURL class]] options:nil];
        NSLog(@"URLs are: %@", urls); 
    }
    return YES;
}
person rdelmar    schedule 08.05.2013
comment
Большое Вам спасибо. Оно работает. Мне кажется, что следующая тема тоже может мне помочь. stackoverflow.com/questions/1998158/ - person El Tomato; 09.05.2013
comment
Этот ответ золотой. У меня были огромные проблемы с получением более чем одного NSURL с монтажного стола. Я всегда ограничивался одним. Это исправило это. - person Git.Coach; 23.05.2013

Быстрый стиль:

override func performDragOperation(sender: NSDraggingInfo) -> Bool 
{
    if let board = sender.draggingPasteboard().propertyListForType(NSFilenamesPboardType) as? NSArray 
    {              
        for imagePath in board
        {
            if let path = imagePath as? String
            {
                 println("path: \(path)")
            }
        }                
        return true               
    }
    return false
}
person Peter Kreinz    schedule 13.09.2015