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

У меня есть небольшое окно внутри основной xib (MainMenu.xib) с элементом управления NSImageView для приложения OS X. Этот элемент управления представления имеет подкласс NSImageView, который должен принимать файлы, которые приносит пользователь (перетащите n drop). Поскольку у меня нет опыта разработки приложений для 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;
}

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

Спасибо,

2 ответа

Решение

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

- (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;
}

Свифт Стиль:

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
}
Другие вопросы по тегам