起動時に、最後に開いていたファイルを開くには

ドキュメントベースのアプリケーションを起動すると、 名称未設定のドキュメントが新規に作られてしまう。

でもたいていの場合は、 それはすぐに閉じて、 「ファイル>最近使ったファイルを開く」 で最後に使ったファイルを開くんだよね。

少なくとも今作っているアプリケーションは、 そういう使い方が主のものだと思う。

そこで、 アプリケーションが起動した時に名称未設定のファイルを開こうとする委譲メソッドを上書きしてみた。

-(BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender

この委譲メソッドは Untitled File を作ってもいい場合は YES、 作らないでほしい場合は NO を返すようにする。

なので、 このメソッドの中で最近使ったファイルを参照してファイルを開き、 NO を返すように実装してみた。

最近使ったファイルのリストは、 ドキュメントコントローラの recentDocumentURLs で取り出せる。 その先頭の URL が最も最近使ったファイルだ。 これさえ取り出せれば、 後はドキュメントコントローラの openDocumentWithContentsOfURL:display:error: で開けばよい。

開けばよいとは書いたけど、 本当にこのロジックでいいのかは自信がないんだけどね。

せっかくなのでサンプルコードを以下に。 ただ、 AlertPanel を出すテストはしていないので、 エラー処理は参考にならないかも。

-(BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
  NSDocumentController *docContr = [NSDocumentController
                                    sharedDocumentController];
  NSArray *recentURLs = [docContr recentDocumentURLs];
  if ([recentURLs count] == 0)
    return YES;
  NSURL *lastURL = [recentURLs objectAtIndex:0];
  if (![[NSFileManager defaultManager] fileExistsAtPath:[lastURL path]])
    return YES;
  NSError *error = nil;
  if (![docContr openDocumentWithContentsOfURL:lastURL
                                       display:YES
                                         error:&error])
    {
      NSString *title;
      title = NSLocalizedString(@"Can't open last file",
                                @"Can't open last file");
      NSRunAlertPanel(title, @"%s", @"OK", nil, nil,
                      [error localizedDescription]);
      return YES;
    }
  return NO;
}