1

ココアアプリケーションから新しいアルバムを作成しようとして髪を引き裂いています。applescriptでは、これは簡単な手順です。

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

しかし、これがスクリプトブリッジを介してCocoaでどのように行われるかを理解することはできません。私はこれを試しました:

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

しかし、それは効果がありませんでした。

助けてください!

4

2 に答える 2

2

一度CocoaScriptingブリッジを使用しようとしましたが、成功しませんでした。私の回避策は、NSAppleScriptクラスを使用することでした。

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

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

[exportScript compileAndReturnError:NULL];
[exportScript executeAndReturnError:NULL];
于 2010-05-10T13:27:12.173 に答える
1

わざわざチェックしていませんが、sdpまたはScripting Bridgeのいずれかにバグがあり、applicationキーワードパラメータを持つコマンドがメインオブジェクトを対象としているため、sdp(eg -newAlbumName:)によって1つのメソッド名が付けられ、SBによって別のメソッド名が付けられていると思われます。 (-newAlbum:name:)。SBをハックすることはできないため、後者のメソッドを使用して最初の引数としてnilを渡すには、sdpで生成されたヘッダーにパッチを適用する必要があります。

または、 SBよりも機能が高く、アプリケーションの互換性の問題が発生しにくいappscriptを使用することもできます。また、より優れた開発ツールとサポートも提供します。たとえば、付属のASTranslateツールを使用してAppleScriptを実行すると、次のobjc-appscriptコードが生成されます。

#import "IPGlue/IPGlue.h"
IPApplication *iphoto = [IPApplication applicationWithName: @"iPhoto"];
IPNewAlbumCommand *cmd = [[iphoto newAlbum] name: @"Test"];
id result = [cmd send];
于 2010-05-10T20:26:08.487 に答える