Cocoaサンプル - ファイルダイアログ

※注意:以下紹介するサンプルはMacOSX10.6以降対応ですので注意してください。
サンプル例:

# Fileメニュー>Openを選択するとファイル選択ダイアログが表示され、
Openボタンを押すと選択したファイルパスをコンソールに表示する。
Cancelを押すと何も行わない。txtファイルのみ選択することができる。
# Fileメニュー>Save Asを選択して保存ファイル名を入力するとファイル選択ダイアログが表示され、
Saveボタンを押すと選択したファイルパスをコンソールに表示する。
Cancelを押すと何も行わない。txtファイルのみ選択することができる。

CocoaアプリケーションプロジェクトにFileDialogControllerクラスを追加します。FileDialogControllerにはOpen, SaveAsメニュー選択時のActionを定義します。

Actionの定義とViewとの接続

FileDialogController.h

#import <Foundation/Foundation.h>
@interface FileDialogController : NSObject
- (IBAction)onSelectSaveAs:(id)sender;
- (IBAction)onSelectOpen:(id)sender;
@end

MainMenu.xibにFileDialogControllerオブジェクトを追加、Recived Actions>onSelectSaveAsとSaveAsメニュー、onSelectOpenとOpenメニューを接続します。

実装

FileDialogController.m

- (IBAction)onSelectSaveAs:(id)sender
{
    NSSavePanel *savePanel	= [NSSavePanel savePanel];
    NSArray *allowedFileTypes = [NSArray arrayWithObjects:@"txt",@"'TEXT'",nil];
    // NSSavePanel interface has changed since Mac OSX v10.6.
    [savePanel setAllowedFileTypes:allowedFileTypes];
    NSInteger pressedButton = [savePanel runModal];
    
    if( pressedButton == NSOKButton ){
        
        // get file path (use NSURL)
        NSURL * filePath = [savePanel URL];
        
        // save file here
        NSLog(@"file saved '%@'", filePath);
        
    }else if( pressedButton == NSCancelButton ){
     	NSLog(@"Cancel button was pressed.");
    }else{
     	// error
    }
}
- (IBAction)onSelectOpen:(id)sender
{
    NSOpenPanel *openPanel	= [NSOpenPanel openPanel];
    NSArray *allowedFileTypes = [NSArray arrayWithObjects:@"txt",@"'TEXT'",nil];
    //  NSOpenPanel interface has changed since Mac OSX v10.6.
    [openPanel setAllowedFileTypes:allowedFileTypes];
    NSInteger pressedButton = [openPanel runModal];
    
    if( pressedButton == NSOKButton ){

        // get file path
        NSURL * filePath = [openPanel URL];
        
        // open file here
        NSLog(@"file opened '%@'", filePath);

    }else if( pressedButton == NSCancelButton ){
     	NSLog(@"Cancel button was pressed.");
    }else{
     	// error
    }
}

パネルを表示するにはrunModal、ファイルタイプを制限するにはsetAllowedFileTypesメソッドに拡張子の文字列配列を渡します。ちなみにファイルが存在するディレクトリのパスはdirectoryURLメソッドで取得できます。