使用Cocoa Scripting Bridge创建iPhoto相册

时间:2010-05-10 12:35:42

标签: objective-c cocoa applescript iphoto scripting-bridge

我正试图从Cocoa应用程序中创建一个新专辑。在AppleScript中,这是一个很简单的过程:

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

但我无法弄清楚如何通过Scripting Bridge在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];

但那没有效果。

请帮忙!

2 个答案:

答案 0 :(得分:3)

我曾尝试使用Cocoa Scripting桥,但没有成功。我的解决方法是使用NSAppleScript类:

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

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

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

答案 1 :(得分:2)

我没有打扰检查,但我怀疑有a bug in sdp或Scripting Bridge,其中具有关键字参数的命令以主application对象为目标,由sdp给出一个方法名称(例如-newAlbumName:)和SB的不同方法名称(-newAlbum:name:)。由于你不能破解SB,你需要修补sdp生成的头以使用后一种方法并将nil作为第一个参数传递。

或者,您可以使用appscript,它比SB更有能力,更不容易出现应用程序兼容性问题。它还提供了更好的开发工具和支持。例如通过随附的ASTranslate工具运行AppleScript会生成以下objc-appscript代码:

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