- [NSWorkspace openFile:withApplication:]等待打开应用程序

时间:2012-01-17 16:05:12

标签: cocoa nsworkspace

Heyho, 在我的Obj-C应用程序中,我使用以下代码在Pages(或任何其他应用程序)中打开文件:

    [[NSWorkspace sharedWorkspace] openFile:theUrl withApplication:@"Pages"];

主要是在打开较大的文件时,可能需要几秒钟才能完成。 所以我希望我的应用程序等待Pages直到它完全打开文件。 以下代码是我喜欢的方式:

    [[NSWorkspace sharedWorkspace] openFile:theUrl withApplication:@"Pages" onFinish:@selector(pagesfinishedopening)];

当然我可以简单地使用sleep()函数,但是这会减慢小文件上的应用程序速度,并且当文件大于例外时不会起作用。 我已经尝试过使用NSApplication,但是后来不打开Pages中文件的打开,只能监视目标应用程序的开始。

任何想法?

2 个答案:

答案 0 :(得分:3)

您可以收听来自NSWorkSpace的notifications,如下所示

- (void)myMethod {
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
                                                       selector:@selector(appDidLaunch:)
                                                           name:NSWorkspaceDidLaunchApplicationNotification
                                                         object:nil];

    [[NSWorkspace sharedWorkspace] openFile:theUrl withApplication:@"Pages"];    
}

- (void)appDidLaunch:(NSNotification*)notification {
    NSLog(@"app info: %@", [notification userInfo]);
}

答案 1 :(得分:2)

也许您可以使用scriptingbridge检查页面是否打开文件,然后在页面打开文件后继续执行应用程序需要执行的操作。任何支持Apple脚本的应用程序都可以使用scriptingbridge编写脚本。找到应用程序的文档有点困难,但我认为应该类似于苹果脚本。

Soem ScriptingBridge文档:

http://www.mugginsoft.com/AutomationDocs

Apple ScriptingBridge使用指南:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/UsingScriptingBridge/UsingScriptingBridge.html

以上解释了如何使用脚本桥,并有一个页面示例(非常简短)。通过一些实验,你应该可以让你的应用程序检查页面是否每秒打开文件直到它打开(即文件未打开,等待一秒 - 可能不是最好的方法,但它的东西)。我认为还有未记录的通知。希望它有所帮助。