Как выполнить эквивалентную команду AppleScript «копировать» из скриптового моста? - PullRequest
0 голосов
/ 20 июля 2010

Есть ли способ сделать удаленное копирование в контейнере из Scripting Bridge? В AppleScript это выглядит как «копировать [элемент] из [контейнера] в [местоположение в контейнере]». Например, в контексте сообщения для документа TextEdit вы можете «скопировать первый абзац его текста в конец его текста», чтобы скопировать первый абзац в конец документа, сохранив все форматирование.

Есть ли способ сделать из Objective-C использование Scripting Bridge?

Я пробовал что-то вроде этого:

SBObject* foo = [container objectAtIndex: 0];
[container addObject: foo];

И получил сообщение «невозможно добавить объект, который уже существует». на консоли; похоже, что addObject и различные методы replace* работают только тогда, когда вы создаете новый экземпляр SBObject и вставляете его.

1 Ответ

1 голос
/ 21 июля 2010

Если вторым параметром встроенной команды AppleScript copy является ссылка на приложение, AppleScript «услужливо» создает псевдоним для команды приложения duplicate или set, в зависимости от того, является ли первый параметр другой ссылкой или нет.Чтобы избежать путаницы, лучше всего явно использовать duplicate или set при работе со скриптовыми приложениями в AppleScript.

Что касается SB, вам нужно искать метод duplicate... в заголовочном файле.Имейте в виду, что команда duplicate SB является полукомплексной ( SB имеет довольно много недостатков ), поскольку она может иметь дело только с одним объектом одновременно.Большинство приложений позволяют вам управлять несколькими объектами в одной команде (предупреждают об ошибках в их поддержке сценариев), например, AppleScript позволит вам сказать:

tell application "iTunes"
    duplicate (every track whose artist is "Foo") to (playlist "Bar")
end tell

, а SB - нет;вместо этого вы должны извлечь список отдельных ссылок и перебрать их, обрабатывая их по одной за раз.Делает ваш код довольно длинным и может быть очень неэффективным, если у вас есть большое количество объектов в другом месте.

Другой вариант - objc-appscript , который делает все эти вещи правильно и гораздо менее подвержен проблемам совместимости приложений в целом («совместимость по принципу quirk-for-quirk», как утверждает Мэтт Нойбург).Это).Кроме того, вы получаете ASTranslate, который преобразует команды AppleScript в эквивалентный синтаксис Python / Ruby / ObjC - очень удобно при поиске правильного выражения команды:

#import "ITGlue/ITGlue.h"
ITApplication *itunes = [ITApplication applicationWithName: @"iTunes"];
ITReference *ref = [[itunes tracks] byTest: [[ITIts artist] equals: @"Foo"]];
ITDuplicateCommand *cmd = [[ref duplicate] to: [[itunes playlists] byName: @"Bar"]];
id result = [cmd send];

Еще один вариант, если вы используете 10.6было бы использовать мост AppleScriptObjC, который позволяет объединять AS и ObjC в одной программе без всякой неприятной чепухи NSAppleScript.Это позволит вам использовать AppleScript для достижения наилучших результатов (общение с другими приложениями) и ObjC для всего остального.Официальная документация ограничена , но веб-поиск должен создавать различные сторонние ресурсы.MacScripter.net может быть хорошим местом для начала - в дополнение к форуму АСОК Крэйг Уильямс недавно опубликовал серию руководств.

(Кстати, Крейг также написал главу об АСОК для третьего издания Apress Learn AppleScript, который я написал в соавторстве и который содержит много информации о принципах и методах написания сценариев приложений, включая разъяснение set/duplicate/copy.)

...