2010-05-10 4 views
1

Cocoa 응용 프로그램에서 새 앨범을 만들려고 머리가 찢어지고 있습니다. AppleScript로 그것은 좋은 간단한 절차입니다 :Cocoa Scripting Bridge를 사용하여 iPhoto 앨범 만들기

tell application "iPhoto" 
    new album name "Album" 
end tell 

하지만이 스크립팅 다리를 통해 코코아에서 수행되는 방법을 작동하지 않을 수 있습니다. 나는 이것을 시도했다 :

iPhotoApplication *iPhoto = [SBApplication applicationWithBundleIdentifier:@"com.apple.iPhoto"]; 
iPhotoAlbum *newAlbum = [[[[iPhoto classForScriptingClass:@"album"] alloc] initWithProperties:[NSDictionary dictionaryWithObject:@"Album" forKey:@"name"]] autorelease]; 
[[iPhoto albums] addObject:newAlbum]; 

그러나 그것은 아무런 효과가 없었다.

도와주세요!

답변

2

을,하지만 난 a bug in 중 키워드 매개 변수가 명령 메인 application 개체를 대상으로하는 경우 브리지 SDP 또는 스크립팅 주어진 하나가 의심 메소드 이름은 sdp (예 : -newAlbumName:)이고 다른 메소드 이름은 SB (-newAlbum:name:)입니다. SB를 해킹 할 수 없기 때문에 sdp 생성 헤더를 패치하여 후자의 메소드를 사용하고 nil을 첫 번째 인수로 전달해야합니다.

또는 appscript을 사용할 수도 있습니다. 이는 SB보다 응용 프로그램 호환성 문제가 적고 기능이 적습니다. 또한 더 나은 개발 도구와 지원을 제공합니다. 예 : 첨부 ASTranslate 도구를 통해 애플 스크립트를 실행하면 다음과 objc-appscript 코드를 생성합니다

#import "IPGlue/IPGlue.h" 
IPApplication *iphoto = [IPApplication applicationWithName: @"iPhoto"]; 
IPNewAlbumCommand *cmd = [[iphoto newAlbum] name: @"Test"]; 
id result = [cmd send]; 
+0

답변 해 주셔서 감사합니다. sdp가 헤더 파일을 잘못 생성 한 것 같습니다. 아마도 "새 앨범"이 클래스에 없기 때문일 것입니다. appscript가 배후에서 어떻게 보이는지 살펴 보겠습니다. D – robinjam

+0

iPhoto의 사전은 잘못 설계되었지만'new album' 명령의 구조와 사용법은 완벽하게 유효합니다. iTune의'play' 명령과는 다른 합법적 인 예입니다. sdp와 SB는 응용 프로그램 사전 정의 명령을 동일한 방식으로 ObjC 메서드로 변환하지 않습니다. 그것은 정말 기본적인 버그입니다. – has

+1

AppScript는 AppleScript가 작동하는 방식을 모방하여 호스트 언어의 기능에 맞게 조정되었습니다. ObjC 메소드는 선택적 arg를 수행하지 않기 때문에 일련의 체인 메소드 호출을 사용하여 명령 ('-newAlbum')을 작성하고 각 매개 변수 ('-name :')를 압축 한 다음 마지막으로 ('-send') . 이것은 원래의 Carbon C API ('AECreateAppleEvent','AEPutParamDesc','AESendMessage')를 사용하여 애플 이벤트를 만들고 보내는 방식과 매우 흡사하며 그 호출에 어느 정도 직접적으로 매핑됩니다. – has

3

나는 한 번 코코아 스크립팅 브리지를 사용해 보았지만 성공하지 못했습니다. 내 해결 방법은 NSAppleScript 클래스 사용했다 : 나는 확인 귀찮게하지 않은

NSString * scriptSource = [NSString stringWithFormat: 
    @"tell application \"iPhoto\" to import from \"%@\"", path]; 

NSAppleScript * exportScript = 
    [[NSAppleScript alloc] initWithSource:scriptSource];  

[exportScript compileAndReturnError:NULL]; 
[exportScript executeAndReturnError:NULL]; 
+0

감사합니다; 그것은 잘 작동합니다. 스크립트가 반환 한 값을 얻을 수있는 방법이 있습니까? – robinjam

관련 문제