为什么 NSApplicationDelegate 方法 openFiles: 在多次拖动到停靠栏图标时被多次调用?
Why NSApplicationDelegate method openFiles: is being called multiple times on a multiple drag to the dock icon?
我有一个 Mac OS X 应用程序,它实现了 -(void)application openFiles:
方法来响应应用程序图标上拖动的文件。
我的目标信息设置的文档类型部分中有一个允许的文件类型列表,Finder 确实允许拖动,但是当 PDF 在拖动项目列表中时,我的委托方法被调用两次:一次用于没有 PDF 的所有元素,只有 PDF 的元素。
这当然使我无法妥善处理。
任何人都可以帮助我或解释发生了什么事吗?谢谢
我在我的一个应用程序中看到过这种行为(通常是在一次拖动一大堆文件时)。在我的变通方法中,我没有直接从 application:openFiles:
打开文件,而是将它们排队并在稍有延迟后打开排队的文件。类似于以下内容:
- (void) application:(NSApplication*)sender openFiles:(NSArray*)filenames
{
// I saw cases in which dragging a bunch of files onto the app
// actually called application:openFiles several times, resulting
// in more than one window, with the dragged files split amongst them.
// This is lame. So we queue them up and open them all at once later.
[self queueFilesForOpening:filenames];
[NSApp replyToOpenOrPrint:NSApplicationDelegateReplySuccess];
}
- (void) queueFilesForOpening:(NSArray*)filenames
{
[self.filesToOpen addObjectsFromArray:filenames];
[self performSelector:@selector(openQueuedFiles) withObject:nil afterDelay:0.25];
}
- (void) openQueuedFiles
{
if( self.filesToOpen.count == 0 ) return;
[self makeNewWindowWithFiles:self.filesToOpen];
[self.filesToOpen removeAllObjects];
}
我有一个 Mac OS X 应用程序,它实现了 -(void)application openFiles:
方法来响应应用程序图标上拖动的文件。
我的目标信息设置的文档类型部分中有一个允许的文件类型列表,Finder 确实允许拖动,但是当 PDF 在拖动项目列表中时,我的委托方法被调用两次:一次用于没有 PDF 的所有元素,只有 PDF 的元素。
这当然使我无法妥善处理。
任何人都可以帮助我或解释发生了什么事吗?谢谢
我在我的一个应用程序中看到过这种行为(通常是在一次拖动一大堆文件时)。在我的变通方法中,我没有直接从 application:openFiles:
打开文件,而是将它们排队并在稍有延迟后打开排队的文件。类似于以下内容:
- (void) application:(NSApplication*)sender openFiles:(NSArray*)filenames
{
// I saw cases in which dragging a bunch of files onto the app
// actually called application:openFiles several times, resulting
// in more than one window, with the dragged files split amongst them.
// This is lame. So we queue them up and open them all at once later.
[self queueFilesForOpening:filenames];
[NSApp replyToOpenOrPrint:NSApplicationDelegateReplySuccess];
}
- (void) queueFilesForOpening:(NSArray*)filenames
{
[self.filesToOpen addObjectsFromArray:filenames];
[self performSelector:@selector(openQueuedFiles) withObject:nil afterDelay:0.25];
}
- (void) openQueuedFiles
{
if( self.filesToOpen.count == 0 ) return;
[self makeNewWindowWithFiles:self.filesToOpen];
[self.filesToOpen removeAllObjects];
}