Cocoa API解説(macOS/iOS)

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。

目次

OS X 10.7でのオープンパネル

しばらくMacのアプリを書いていなかったらすっかり変わっていた。
ファイル選択、以前はrunModalForDirectory:file:types:などを使っていたけど、今はBlocksを使うんだそうだ。

ブロックから値を渡すにはperformSelectorOnMainThread:withObject:waitUntilDone:でオブジェクトと共にメソッドを呼び出しているけど、きっと他にいい方法がありそうだ。
ちょっと探そう。

NSInvocationでもメソッド呼び出しはできるけど、メインスレッドで動くかどうかわからないからなあ。
GCDなら行けるかな

Blocksを使うのはこんな感じ

#pragma mark initWithData:
- (void)displayText:(NSString *)text {
	self.fileString = text;
    NSLog(@"text %@",text);
}
-(void)method010
{
    //FileSystem programming guide
    //http://developer.apple.com/library/ios/#DOCUMENTATION/FileManagement/Conceptual/FileSystemProgrammingGUide/UsingtheOpenandSavePanels/UsingtheOpenandSavePanels.html
    
    
    //OpenPanelを作る
    NSOpenPanel  *opPanel       = [ NSOpenPanel openPanel ];

    //OpenPanelでファイル選択
    //この方法は10.6以降
    [opPanel setCanChooseDirectories:YES];
    [opPanel setAllowsMultipleSelection:YES];
    [opPanel setPrompt:NSLocalizedString(@"Add torrent", nil)];
    [opPanel setMessage:@"Message"];
    
    [opPanel beginWithCompletionHandler:^(NSInteger result){
        
        if (result == NSFileHandlingPanelOKButton) {
            NSURL*  theDoc = [[opPanel URLs] objectAtIndex:0];
            
            // Open  the document.
            NSData *dat = [NSData dataWithContentsOfURL: theDoc ];
            
            NSString *output = [[NSString alloc] initWithData:dat encoding:NSASCIIStringEncoding];
            
            
            [self performSelectorOnMainThread:@selector(displayText:) withObject:output waitUntilDone:NO];
            
        }
    }];
    
    
}


ちなみに以前の方法

#import "SetImage.h"
@implementation SetImage
- (IBAction)set:(id)sender
{
    //開けるファイル拡張子の配列
    NSArray      *fileTypes    = [ NSArray arrayWithObject : @"txt" ];
    //OpenPanelを作る
    NSOpenPanel  *opPanel       = [ NSOpenPanel openPanel ];
    //
    NSData *dat;
    NSFileManager *myFile = [ NSFileManager defaultManager];
    //OpenPanelの結果のボタン番号
    int		  opRet;
     //OpenPanelでファイル選択   
    opRet = [ opPanel runModalForDirectory : NSHomeDirectory() //どこのディレクトリを出すか
                                     file : @"Documents" //どのファイルを選択しておくか
                                    types : fileTypes ];//選べるファイルタイプ
    if ( opRet == NSOKButton ) {  // OPENPanelのボタンがOKなら
        //ファイルから読み込む
        dat = [myFile contentsAtPath:[opPanel filename]];
        [name setStringValue:[[NSString alloc] initWithData:dat
                                        encoding:NSShiftJISStringEncoding
                                        ]];    
    }
}
@end

すっかり浦島太郎だねー。

2014.5.25追記
SandBox環境ではUser Selected FileをR/Wにしておかないといけない。
30分ほどはまってしまった。