0

NSSavePanelは、テキスト ファイルを扱う場合にのみ使用します。エクスポートする画像がある場合は、ユーザーがディレクトリを選択できるようにNSOpenPanelを使用します。サンドボックスのファイル パスの制限に引っかかることはありません。今回は、NSSavePanel を使用して、ユーザーが画像ファイル (bmp、gif、jpeg、jp2、png) を保存できるようにします。

- (void)exportfile {    
    NSString *documentFolderPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSSavePanel *panel = [NSSavePanel savePanel];

    [panel setMessage:@"Please select a path where to save checkboard as an image."]; // Message inside modal window
    if ([self fileExists:destinationpath]) {
        [panel setDirectoryURL:[NSURL fileURLWithPath:destinationpath]];
    } else {
        [panel setDirectoryURL:[NSURL fileURLWithPath:documentFolderPath]];
    }

    //[panel setAllowedFileTypes:[[NSArray alloc] initWithObjects:@"bmp",@"gif",@"jpg",@"jp2",@"png",nil]];
    [panel setAllowsOtherFileTypes:YES];
    [panel setExtensionHidden:YES];
    [panel setCanCreateDirectories:YES];
    [panel setNameFieldStringValue:filename];
    [panel setTitle:@"Saving checkboard..."]; // Window title
    [panel setAccessoryView:accessoryView1];

    NSInteger result = [panel runModal];
    NSError *error = nil;

    if (result == NSOKButton) {     
        ////////////////////////////////////////////
        NSString *path0 = [[panel URL] path];
        NSMutableString *path1 = [[NSMutableString alloc] initWithString:path0];
        if (formatIndex1 == 0) { // formatIndex1 is the index of NSPopMenu
            [path1 appendString:@".bmp"];
        }
        else if (formatIndex1 == 1) {
            [path1 appendString:@".gif"];
        }
        else if (formatIndex1 == 2) {
            [path1 appendString:@".jpg"];
        }
        else if (formatIndex1 == 3) {
            [path1 appendString:@".jp2"];
        }
        else if (formatIndex1 == 4) {
            [path1 appendString:@".png"];
        }
        [self exportfile2:path1]; // <<<<<<<<<<<<<<< Immediate goal
        ////////////////////////////////////////////

        if (error) {
            [NSApp presentError:error];
        }
    }
}

この NSSavePanel には AccessoriesView コントロールがあり、ユーザーはNSPopupMenuでグラフィック形式を選択できます。そのインデックスは formatIndex1 です。アプリケーションがサンドボックス化されている場合、コードが失敗することはわかっています。これは、ユーザーが選択した正確なパスが path0 であり、上記のコードが exportfile2 に到達する前にファイル拡張子を追加するためです。では、ファイル拡張子付きの正確なパスを取得するにはどうすればよいでしょうか。 「拡張子を非表示」がオフの場合、プレビューはファイル拡張子を自動的に追加します。それでも、Preview は画像のエクスポートに失敗しません。

ご協力ありがとうございました。

4

1 に答える 1

2

以下のようにしてみてください:-

- (void)exportfile {    
    NSSavePanel *panel = [NSSavePanel savePanel];
NSString *fileName=nil;

        if (formatIndex1 == 0) { // formatIndex1 is the index of NSPopMenu
        fileName=@"untitle.bmp"
        }
        else if (formatIndex1 == 1) {
        fileName=@"untitle.gif"
        }
        else if (formatIndex1 == 2) {
          fileName=@"untitle.jpg"
        }

[panel setMessage:@"Please select a path where to save checkboard as an image."]; // Message inside modal window
    [panel setAllowsOtherFileTypes:YES];
    [panel setExtensionHidden:YES];
    [panel setCanCreateDirectories:YES];
    [panel setNameFieldStringValue:filename];
    [panel setTitle:@"Saving checkboard..."]; // Window title
    [panel setAccessoryView:accessoryView1];

    NSInteger result = [panel runModal];
    NSError *error = nil;

    if (result == NSOKButton) {     
        ////////////////////////////////////////////
        NSString *path0 = [[panel URL] path];


        [self exportfile2:path0]; // <<<<<<<<<<<<<<< Immediate goal
        ////////////////////////////////////////////

        if (error) {
            [NSApp presentError:error];
        }
    }
}
于 2013-08-26T17:07:10.407 に答える