2010-05-10 12 views
1

Je m'arrache les cheveux en essayant de créer un nouvel album à partir d'une application Cocoa. Dans AppleScript est une procédure simple et agréable:Création d'albums iPhoto à l'aide de Cocoa Scripting Bridge

tell application "iPhoto" 
    new album name "Album" 
end tell 

Mais je ne peux pas travailler comment cela se fait dans Cocoa via le pont de script. J'ai essayé ceci:

iPhotoApplication *iPhoto = [SBApplication applicationWithBundleIdentifier:@"com.apple.iPhoto"]; 
iPhotoAlbum *newAlbum = [[[[iPhoto classForScriptingClass:@"album"] alloc] initWithProperties:[NSDictionary dictionaryWithObject:@"Album" forKey:@"name"]] autorelease]; 
[[iPhoto albums] addObject:newAlbum]; 

Mais cela n'a eu aucun effet.

Aidez s'il vous plaît!

Répondre

2

Je ne l'ai pas pris la peine de vérifier, mais je soupçonne qu'il est a bug in soit sdp ou Pont de script où les commandes qui ont des paramètres de mots clés sont ciblés à l'objet principal application sont une donnée nom de la méthode par sdp (par exemple -newAlbumName:) et un nom de méthode différent par SB (-newAlbum:name:). Puisque vous ne pouvez pas bidouiller SB, vous devez patcher l'en-tête généré par sdp pour utiliser la dernière méthode et passer nil comme premier argument.

Vous pouvez également utiliser appscript, qui est plus capable et moins sujet aux problèmes de compatibilité des applications que SB. Il fournit également de meilleurs outils de développement et de soutien. par exemple. L'exécution de votre AppleScript via l'outil ASTranslate associé produit le code objc-appscript suivant:

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

Merci pour votre réponse. Il semble que sdp ait en fait généré les fichiers d'en-tête mal - probablement parce que "new album" n'est pas dans une classe. Je vais jeter un oeil à la façon dont appscript le fait dans les coulisses: D – robinjam

+0

Le dictionnaire d'iPhoto est mal conçu, mais la structure et l'utilisation de la commande 'new album' sont parfaitement valides; ditto iTune commande 'play', qui est un autre exemple légitime. sdp et SB ne traduisent pas de la même manière les commandes définies par le dictionnaire d'application dans les méthodes ObjC. C'est un bug vraiment élémentaire. – has

+1

Appscript imite à peu près le fonctionnement d'AppleScript, ajusté en fonction des capacités du langage hôte. Puisque les méthodes ObjC ne font pas d'arguments optionnels, elle utilise une série d'appels de méthode chaînés pour créer la commande ('-newAlbum'), emballe chaque paramètre (' -name: '), et finalement l'envoie (' -send') . C'est très similaire à la façon dont vous construisez et envoyez des événements Apple en utilisant les API Carbon C originales ('AECreateAppleEvent',' AEPutParamDesc', 'AESendMessage') et mappe plus ou moins directement sur ces appels. – has

3

J'ai essayé une fois d'utiliser le pont Cocoa Scripting, sans succès. Ma solution était d'utiliser NSAppleScript classe:

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

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

[exportScript compileAndReturnError:NULL]; 
[exportScript executeAndReturnError:NULL]; 
+0

Merci; ça marche bien. Est-il possible d'obtenir la valeur renvoyée par le script? – robinjam