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分ほどはまってしまった。