개인적으로 필요한 유틸이 있어서 appleScript 로 만들까하다가
XCode 4.4 로 OS X Application 을 만들어 본 적이 없어서
Drag & Drop, Pipe, File 처리 같은 걸 해봤다.
xib 에 드래그할 대상인 NSImageView 를 놓고
그 NSImageView 를 Customize 한 NSCImageView 를 만들어서 구현했다.
performDragOperation 이벤트에서
NSPasteboard *paste = [sender draggingPasteboard];
로 NSPasteboard 객체에 드래그 한 것들을 가지고
NSFilenamesPboardType 인것들을 타입으로 추출하여 NSData로 받았다.
NSArray *fileArray = [paste propertyListForType:@"NSFilenamesPboardType"];
파일 목록은 propertyListForType으로 string array 를 받을 수 있다.
shell 실행하고 결과 stdout 을 받는 것 처리하는데 위의 링크를 참조했다.
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"<SHELL COMMAND>"];
NSTask 를 setLaunchPath 메서드를 사용하여 콜할 커맨드를 지정하고
[task setArguments:[NSArray arrayWithObjects:<@args>, file, nil]];
N개의 argument 를 지정
NSPipe *pipe=[NSPipe pipe];
[task setStandardOutput:pipe];
실행 후 stdout 을 출력할 대상을 pipe 로 돌려놓고
[task launch];
로 실행.
NSFileHandle *fileHandle = [pipe fileHandleForReading];
파일 핸들은 아까 설정한 pipe 로부터 받았다.
[fileHandle readDataToEndOfFile];
로 받으면 된다.
근데 기껏 만들고 나니 배포하는 법을 모르겠네;
#import "NSCImageView.h"
@implementation NSCImageView
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {
if ((NSDragOperationGeneric & [sender draggingSourceOperationMask])==NSDragOperationGeneric) {
return NSDragOperationGeneric;
} else {
return NSDragOperationNone;
}
}
- (void)draggingExited:(id<NSDraggingInfo>)sender {
}
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
NSPasteboard *paste = [sender draggingPasteboard];
NSString *desiredType = [paste availableTypeFromArray:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
NSData *carriedData = [paste dataForType:desiredType];
if (nil==carriedData) {
return NO;
} else {
if ([desiredType isEqualToString:NSFilenamesPboardType]) {
NSArray *fileArray = [paste propertyListForType:@"NSFilenamesPboardType"];
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"<SHELL COMMAND>"];
for (NSString *file in fileArray) {
[task setArguments:[NSArray arrayWithObjects:<@args>, file, nil]];
NSPipe *pipe=[NSPipe pipe];
[task setStandardOutput:pipe];
NSFileHandle *fileHandle = [pipe fileHandleForReading];
[task launch];
NSData *data;
data = [fileHandle readDataToEndOfFile];
NSString *string;
string=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"filename : %@", file);
[fileHandle closeFile];
[[NSFileManager defaultManager] createFileAtPath:file contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
}
} else {
NSLog(@"Nothing happened");
}
}
[self setNeedsDisplay:YES];
return YES;
}
@end
댓글
댓글 쓰기