Создание альбомов iPhoto с использованием Cocoa Scripting Bridge

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

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 ответа

Решение

Я не удосужился проверить, но я подозреваю, что есть ошибка в sdp или Scripting Bridge, когда команды с параметрами ключевых слов нацелены на основной 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];

Я однажды пытался использовать 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];
Другие вопросы по тегам