Создание альбомов 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];