Проблема с перетаскиванием из NSTableView в Finder - PullRequest
9 голосов
/ 13 июля 2011

Я создал приложение с NSTableView, представляющим серию файлов.Из этого я хочу иметь возможность перетаскивать строку (то есть имя файла) из моего NSTableView в Finder, и файл будет создан в этой папке.Однако я не могу понять, что мне нужно изменить содержимое исходного файла, прежде чем он будет скопирован в Finder.

Я добавил следующую строку, чтобы я мог перетащить за пределы моегоNSTableView:

[self.tableView setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO];    

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

- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard {
    [pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil];        
    NSMutableArray* dragfiles = [[NSMutableArray alloc] init];
    NSString* file = [self.files objectAtIndex:row];
    NSString* filepath = [[[self.pathControl URL] path] stringByAppendingPathComponent:file];
    [dragfiles addObject:filepath];
    [pboard setPropertyList:dragfiles forType: NSFilenamesPboardType];
    [dragfiles release];
} 

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

Я проверил Google и нашел несколько предложений, которые вы можете создать временный файл и использовать этот путь к файлу.Но это выглядит ужасно.

Можно ли отправить данные в Finder?Есть ли способ решить эту проблему?

Ответы [ 2 ]

20 голосов
/ 13 июля 2011

Скорее всего, вы захотите использовать файлы обещаний или NSFilesPromisePboardType вместо NSFilenamesPboardType.(Примечание: методы файла обещания dragPromisedFilesOfTypes:fromRect:source:slideBack:event: и namesOfPromisedFilesDroppedAtDestination:, о которых говорится в этой документации, являются общими NSView методами. NSTableView определяет более удобные методы, которые вы будете использовать вместо общих. Тем не менее, это должнопо-прежнему предоставлять информацию о том, как работает файл обещаний).NSTableView использует tableView:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes:, где вы можете выполнять обработку ваших файлов.В вашем методе tableView:writeRowsWithIndexes:toPasteboard: вы объявите NSFilesPromisePboardType, а затем установите массив расширений имен файлов для типов файлов, которые вы планируете записать.Ниже приведен псевдокод, который описывает, как вы можете к нему подойти:

- (BOOL)tableView:(NSTableView *)aTableView
     writeRowsWithIndexes:(NSIndexSet *)rowIndexes
        toPasteboard:(NSPasteboard *)pboard {
     [pboard declareTypes:[NSArray arrayWithObjects:NSFilesPromisePboardType, nil]];

     NSMutableArray *filenameExtensions = [NSMutableArray array];
     NSArray *draggedFilenames = [self.files objectsAtIndexes:rowIndexes];
     for (NSString *filename in draggedFilenames) {
          NSString *filenameExtension = [filename pathExtension];
          if (filenameExtension.length) {
              [filenameExtensions addObject:filenameExtension];
          }
     }
     [pboard setPropertyList:filenameExtensions
                 forType:NSFilesPromisePboardType];
     return YES;
}

Тогда в вашем методе names-of-обещаноFiles:

- (NSArray *)tableView:(NSTableView *)aTableView
       namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination
       forDraggedRowsWithIndexes:(NSIndexSet *)indexSet {

     NSArray *draggedFilenames = [self.files objectsAtIndexes:indexSet];

     for (NSString *filename in draggedFilenames) {
           // do your processing of files in here
          // if it may take a long time, you might need to do it on a background
          // thread

         NSString *fullPathToOriginal = nil;
          NSString *destPath =
         [[dropDestination path] stringByAppendingPathComponent:filename];


     }
     return draggedFilenames;
}

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

6 голосов
/ 24 октября 2011

На что обратить внимание.

В NSPasteboard.h есть комментарий, который гласит:

/* Use of pboard types should be replaced with use of UTIs.  
   Pboard types will be deprecated in a future release. */

А после определения NSFilesPromisePboardType говорится:

// Use (NSString *)kPasteboardTypeFileURLPromise

Я просто провел несколько часов, стуча головой о кирпичную стену, потому что проходил мимо (NSString *)kPasteboardTypeFileURLPromise вместо NSFilesPromisePboardType в нескольких местах.

Похоже, они не делают одно и то же. Я не мог понять, почему:

tableView:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes 

не вызывали. Когда я снова переключился на NSFilesPromisePboardType,
внезапно это назвали.

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