Создание альбомов iPhoto с использованием Cocoa Scripting Bridge - PullRequest
1 голос
/ 10 мая 2010

Я рву свои волосы, пытаясь создать новый альбом из Приложения Какао. В AppleScript это хорошая простая процедура:

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 ]

3 голосов
/ 10 мая 2010

Я однажды пытался использовать Cocoa Scripting bridge, но безуспешно. Мой обходной путь должен был использовать NSAppleScript class:

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

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

[exportScript compileAndReturnError:NULL];
[exportScript executeAndReturnError:NULL];
2 голосов
/ 11 мая 2010

Я не удосужился проверить, но я подозреваю, что ошибка в либо в sdp, либо в скриптовом мосту, когда команды с параметрами ключевого слова нацелены на главный application объект, которому присваивается одно имя метода по sdp (например, -newAlbumName:) и другое имя метода по SB (-newAlbum:name:). Поскольку вы не можете взломать SB, вам нужно исправить сгенерированный sdp заголовок, чтобы использовать последний метод и передать nil в качестве первого аргумента.

В качестве альтернативы, вы можете использовать appscript , который более способен и менее подвержен проблемам совместимости приложений, чем SB. Это также обеспечивает лучшие инструменты разработки и поддержку. например Запуск вашего AppleScript через сопровождающий инструмент ASTranslate приводит к следующему коду objc-appscript:

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