2006年3月24日

デフォルトドキュメントを指定する方法(解決編)

先日の続き。分かれば何のことは無く、Cocoaの無償の機能の中にすでに含まれている。

まず、試行錯誤してあと少しで上手くそうでイマイチの方法は下記の通り。

  1. まずはNSApplicationのデリゲートメッセージapplicationShouldOpenUntitledFile:に対して、NOを答えて、「名称未設定」ファイルの作成を阻止する。
  2. アプリが起動時したときに1度だけ呼ばれるNSApplicationのデリゲートメッセージapplicationDidFinishLaunching:を受けて、この実装の中でNSDocumentControllerに対して特定のファイルを開かせる。
  3. アプリが非ActiveからActiveになった通知をNSApplicationのデリゲートメッセージapplicationDidBecomeActive:で受けて、この実装の中で開いているドキュメントが1つも無い場合のみNSDocumentControllerに対して特定ファイルを開かせる。

#define DEFAULTFILE @"/Users/user/Documents/defaultFile"
 
- (void)openDefaultFile
{
    [[NSDocumentController sharedDocumentController]
        openDocumentWithContentsOfFile:DEFAULTFILE
        display:YES];
}
 
- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    return NO;
}
 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [self openDefaultFile];
}
 
- (void)applicationDidBecomeActive:(NSNotification *)aNotification
{
    NSArray *docs
        = [[NSDocumentController sharedDocumentController] documents];
    
    if ([docs count] == 0)
        [self openDefaultFile];
}

これで良いのだろうか?何かが違う。 唯一期待通りでないのは、アプリがActiveの状態でドキュメントが一つも無い場合にDock上のアイコンをクリックしても特定ファイルを開かせることができない点。

で、正しい答えはデリゲートメッセージapplicationOpenUntitledFile:を受けて、特定ファイルを開けて、YESを返すこと。このときNOを返すと特定ファイルと「名称未設定」ファイルの二つが開いてしまうので注意しなければいけない。

- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    return NO;
}
 
- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication
{
    [self openDefault];
    return YES;
}

0 件のコメント: