1

デフォルトの [名前を付けて保存] ダイアログ シートからファイルの URL を取得するにはどうすればよいですか? Xcode で Snow Leopard 10.6 SDK を使用してドキュメントベースのアプリケーションを使用しています。

インターネットと Apple のドキュメントを 2 日間探し回った結果、[名前を付けて保存] ダイアログ シートの固有のインスタンスを使用する回答しか見つかりませんでした。誰もが独自の [ファイル] -> [保存] 機能を作成して車輪を再発明したいと考えているようですが、それは私がやろうとしていることではありません。私はすでにそれを行っています!

たとえば、私はこのアプローチを使用したくありません。デフォルト-(void)saveDocumentAs:senderNSDocument次のように置き換えたくありません。

- (IBAction)saveFileAs:(id)sender
{
    NSSavePanel *spanel = [NSSavePanel savePanel];
    [spanel setCanCreateDirectories:YES];
    [spanel setCanSelectHiddenExtension:YES];
    [spanel setAllowedFileTypes:[[self currentDocument] writableTypesForSaveOperation:NSSaveAsOperation]];
    [spanel setTreatsFilePackagesAsDirectories:YES];
    [spanel beginSheetModalForWindow: [[[[self currentDocument] windowControllers] objectAtIndex:0] window]  completionHandler:^(NSInteger result)
     {
         if (result == NSFileHandlingPanelOKButton)
         {
             NSString *type = [[self currentDocument] fileTypeFromLastRunSavePanel];
             NSLog(@"%@", type);
             NSURL *saveURL = [spanel URL];
             NSLog(@"%@", saveURL);
             [[self currentDocument] dataOfType:type error:nil];

         }
     }];
}

NSSavePanelむしろ、ユーザーがデフォルトシートからファイル用に選択したファイル URL だけが必要です。このテストからわかるfileTypeFromLastRunSavePanelように、 はブロック内では機能しないため、ファイル URL ではなくデフォルトの保存パネルでファイル タイプを取得するか、ファイルではなくカスタム保存パネルからファイル URL を取得します。型くずれもありませんfileTypeFromLastRunSavePanel

  1. ユーザーがファイルを開く
  2. ユーザーがファイルを変更する
  3. ユーザーが「名前を付けて保存...」
  4. ユーザーはファイルの新しい名前を入力し、[保存] を押します
  5. ファイルの新しい名前が必要です。savePanel の独自のインスタンスを作成せずに取得するにはどうすればよいですか?

編集: [self fileURL]NSDocument サブクラス内で試しました

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError

メソッドですが、ドキュメントが既にディスクに保存されていない限り、null を返します。

編集 2: ここで私が求めていることを具体的に明確にするために、NSSavePanel の savePanel の独自のインスタンスではなく、デフォルトの NSSavePanel savePanel からユーザーが選択した URL を取得するにはどうすればよいですか? NSSavePanel のサブクラスを作成してそのメソッドをオーバーライドせずにこれを行うことはできますか? 独自の NSSavePanel インスタンスにその機能を追加しなくても、デフォルトの savePanel でユーザーが選択したファイルへのある種の URL 参照が与えられるのは理にかなっていると思いました。

4

4 に答える 4

4
NSSavePanel *panel = [NSSavePanel savePanel];

[panel setMessage:@"Please select a path to create a new database."]; // Message inside modal window
[panel setAllowedFileTypes:[[NSArray alloc] initWithObjects:@"sqlite3", @"sqlite", @"db", nil]];
[panel setAllowsOtherFileTypes:YES];
[panel setExtensionHidden:NO];
[panel setCanCreateDirectories:YES];
[panel setTitle:@"Create a database"]; // Window title
[panel setNameFieldStringValue:@"Untitled.sqlite3"];

[panel beginWithCompletionHandler:^(NSInteger result){
    if (result == NSFileHandlingPanelOKButton) {
        path = [[panel URL] path];
        url = [panel URL];
    }
}];
于 2015-06-18T12:32:26.760 に答える
0

NSSavePanel参照ドキュメントを見ると、メソッドが明確に示され、次のURLように述べられています。

パネルに現在表示されているファイルの絶対パス名を URL として返します。

検索エンジンに「NSSavePanel」と入力して出てきた最初の結果です。

于 2013-10-05T05:25:36.933 に答える