Mac App:'自动加载'上次使用的文档

时间:2011-01-23 04:34:24

标签: objective-c cocoa xcode macos

我目前正在编写一个基于文档的应用程序,并且很想知道如何在应用程序启动时默认加载最近使用过的文档('File> Open Recent'部分)?有关此代码段或代码段的任何好消息吗? Obj-C新手

谢谢, 扎克

2 个答案:

答案 0 :(得分:7)

在您的应用程序委托中,您需要实现applicationShouldOpenUntitledFile:

- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    NSURL *lastURL=[[[NSDocumentController sharedDocumentController] recentDocumentURLs] objectAtIndex:0];
    if (lastURL!=nil)
    {
        [[NSDocumentController sharedDocumentController] openDocumentWithContentsOfURL:lastURL display:YES error:nil];  
        return NO;
    }

    return YES;
}

显然,XCode中默认的基于NSDocument的cocoa应用程序没有AppDelegate。奇怪的。添加一个:

  • 在项目中添加一个新类,称之为MyAppDelegate,或任何你想要的。
  • 在MyAppDelegate的界面中,添加协议NSApplicationDelegate,它应该如下所示:

    @interface MyAppDelegate:NSObject< NSApplicationDelegate> { }

  • 打开MainMenu.xib

  • 将Object实例拖到xib的窗口,Object实例看起来像一个蓝色框。
  • 选择对象实例,然后在检查器中转到“标识”选项卡(蓝色i)
  • 将Class设置为MyAppDelegate
  • 在xib中选择“应用程序”
  • 在检查器中,单击“连接”选项卡(蓝色箭头图标)并从“委托”拖动到刚刚设置的应用程序委托。

你现在好了。

答案 1 :(得分:0)

所以上面的代码几乎是完美的。我遇到的唯一问题是,如果这是一个新的应用程序,那么recentDocumentURL的列表可能是空的(或零),因此要求获取nil数组的objectAdIndex:0将导致问题。我建议在方法声明之后立即输入以下代码。

NSArray *list = [[NSDocumentController sharedDocumentController] recentDocumentURLs];
if ((list == nil) || ([list count] == 0))
    return YES;

我想避免的错误如下:

  

2014-01-28 17:02:33.042 jNotebook [8144:303] * - [__ NSArrayM objectAtIndex:]:索引0超出空数组的界限