Чтение нескольких перетаскиваемых файлов
У меня есть небольшое окно внутри основной 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
}