5

NSDocument サブクラスの任意のフォルダーを開くことができるアプリケーションを作成しようとしていますが、正しい Info.plist 設定を理解できません。アプリでバンドルを使用したり、特定のファイル拡張子を持つフォルダーを使用したり、任意のフォルダーを開くことができないことが重要です。

私が試したこと:

  • ドキュメントタイプの拡張子を空の文字列に設定すると、ファイルを開くパネルでファイルを選択できなくなります
  • ドキュメントタイプの拡張子を * に設定すると、ファイルを開くパネルですべてのファイルが有効になりますが、フォルダーは有効になりません。フォルダーはファインダーのように開かれます
  • フォルダー拡張子をドキュメントタイプ拡張子に設定すると、ファイルを開くダイアログでフォルダーをドキュメントとして開くことができます (これが私が望むものです) が、ソリューションをその拡張子を持つフォルダーに制限します
  • OSType を "fold" に設定したり、ドキュメント タイプの識別子や名前を "public.folder" に設定したりしても、フォーラムについて読んでも目に見える効果はありません。

ファイルを開くダイアログで任意のフォルダを開くにはどうすればよいですか?

4

3 に答える 3

6

完全を期すために、@iKenndacの回答の詳細を以下に示します。

IBで、FirstResponderのどのメソッドがFile/Open...メニュー項目に関連付けられているかを確認します。私の場合はでしたopenDocument:。AppDelegateにこのメソッドを実装します。

-(void)openDocument:(id)sender
{
    NSOpenPanel *panel = [NSOpenPanel openPanel];
    [panel setCanChooseFiles:NO];
    [panel setCanChooseDirectories:YES];
    [panel setAllowsMultipleSelection:NO];

    [panel beginSheetModalForWindow:nil
                  completionHandler:^(NSInteger result) {
                      if (result == NSFileHandlingPanelOKButton) {
                          NSURL* selectedURL = [[panel URLs] objectAtIndex:0];
                          NSLog(@"selected URL: %@", selectedURL);
                          NSError* error = nil;
                          [[NSDocumentController sharedDocumentController] 
                              openDocumentWithContentsOfURL:selectedURL 
                                                   display:YES 
                                                     error:&error];
                      }
                  }];
}

それでも、Info.plistでドキュメントタイプを定義し、識別子(LSItemContentTypes)フィールドをに設定する必要がありますpublic.folder

于 2012-12-20T14:48:00.827 に答える
3

今日それを行う方法の最新の要約として、ここに私がしなければならなかったことの段階的なガイドがあります:

  1. Xcode を使用して、 Cocoa アプリケーションテンプレートからアプリケーション プロジェクトを作成します。

  2. [ドキュメント ベースのアプリケーションの作成] をオンにして、「ドキュメント拡張子」に提案されているものはそのままにしておきます (ファイル名拡張子をここで削除すると、[次へ] ボタンを有効にすることが拒否されるため、後で行います)。

  3. プロジェクトのアイコンをクリックし、[情報] タブと [ドキュメント タイプ] に移動します。

  4. Extensionsフィールドの内容を削除します。フォルダーに特定のファイル名サフィックスは必要ありません

  5. public.folderIdentifierフィールドに書き込みます。

  6. CFBundleTypeOSTypes配列の [追加のドキュメント タイプ プロパティ]の下に、 foldというエントリを 1 つ追加します(これらの 4 つの小文字のみ)。それが必要かどうかはわかりませんが、少なくとも正しいです。

  7. バンドルがチェックされていないため、ドキュメントが配布されていることを確認してください。

  8. NSDocumentController次のメソッドを含むサブクラスをプロジェクトに作成します。名前を付けULIFolderDocumentControllerます。

    -(void)openDocument:(id)送信者
    {
        NSOpenPanel *panel = [NSOpenPanel openPanel];
        [パネル setCanChooseFiles:いいえ];
        [パネル setCanChooseDirectories:YES];
        [パネル setAllowsMultipleSelection:NO];

        [パネル beginWithCompletionHandler: ^( NSInteger 結果 )
        {
            if (結果 == NSFileHandlingPanelOKButton)
            {
                NSURL* selectedURL = [[パネル URL] objectAtIndex:0];
                NSLog(@"選択した URL: %@", selectedURL);
                [自己 openDocumentWithContentsOfURL: selectedURL
                        表示: はい
                        completionHandler: ^(NSDocument * _Nullable ドキュメント、BOOL documentWasAlreadyOpen、NSError * _Nullable エラー)
                        {
                            NSLog(@"%spened document %@ (%@)", (documentWasAlreadyOpen? "Reo" : "O"), document, error);
                        }];
            }
        }];
    }
  1. -initの代わりにサブクラスをロードする行をアプリ デリゲートのメソッドに追加しますNSDocumentController。これは簡単です。共有オブジェクトをリクエストするだけです:
    [ULIFolderDocumentController sharedDocumentController]; // システムの NSDocumentController を私たちのものでオーバーライドします。
  1. それを試してみてください!:)
于 2016-04-17T12:50:24.623 に答える
3

カスタム コードを作成しないと、おそらくこれを行うことはできません。

NSOpenPanel次のように、手動で提示する必要があります。

NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel setCanChooseFiles:NO];
[panel setCanChooseDirectories:YES];

[panel beginSheetForDirectory:nil
                         file:nil
               modalForWindow:[self window]
                modalDelegate:self
               didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:)
                  contextInfo:nil];

この方法で表示されるオープン パネルにより、ユーザーは任意のディレクトリを選択できます。のデリゲート メソッドを実装NSOpenPanelして、各フォルダーを検証し、必要に応じて有効化/無効化できます。

于 2012-12-20T13:30:12.157 に答える