2010-05-10 73 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無論是SDP或腳本橋,其中有關鍵字參數的命令針對的主要對象application給出一個方法名稱(例如-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]; 
+0

感謝您的回覆。似乎sdp實際上已經生成了頭文件錯誤 - 可能是因爲「新專輯」不在類中。我會看看appscript是如何在幕後做的:D – robinjam 2010-05-10 22:25:00

+0

iPhoto的字典設計不好,但是「新專輯」命令的結構和用法是完全有效的;同樣是iTune的「play」命令,這是另一個合理的例子。 sdp和SB根本不會將應用程序字典定義的命令以同樣的方式轉換爲ObjC方法。這是一個非常基本的錯誤。 – has 2010-05-11 18:26:39

+1

Appscript非常模仿AppleScript的工作方式,進行調整以適應主機語言的功能。由於ObjC方法不執行可選參數,因此它使用一系列鏈式方法調用來創建命令('-newAlbum'),打包每個參數('-name:'),並最終發送它(「-send」) 。這與您使用原始Carbon C API('AECreateAppleEvent','AEPutParamDesc','AESendMessage')構建和發送Apple事件的方式非常相似,並且或多或少直接映射到這些調用。 – has 2010-05-11 18:32:48

3

我試過一次使用Cocoa Scripting bridge,但沒有成功。我的解決方法是使用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 2010-05-10 15:55:48