我正试图从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];
但那没有效果。
请帮忙!
答案 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];