Команды сценария
Какао, пишущее сценарий объектов команды сценария использования для обработки связанные со сценариями события Apple, полученные приложением. В этой главе описываются, как работают команды сценария, и как Ваше приложение использует их, чтобы поддерживать его scriptable функции.
Обзор команд сценария
Когда пользователь выполняет сценарий AppleScript, операторы сценария, предназначающиеся для Вашего приложения, преобразовываются в соответствующие события Apple и отправляются в приложение. Для каждого события Apple, соответствующего команде, определенной в Вашем sdef, сценарии Какао инстанцируют объекта команды сценария, содержащего всю информацию, должен был описать указанную работу. Это тогда выполняет команду сценария, работающую с объектами в Вашем приложении для выполнения работы. Поток событий Apple двунаправлен, и команды сценария могут возвращаемые значения к инициирующему сценарию.
Сценарии какао предоставляют поддержку по умолчанию для многих основных команд AppleScript, такой как delete
, move
, get
, и set
. Эта поддержка реализована NSScriptCommand
класс и много подклассов. В некоторых случаях это также полагается на информацию о команде, которую необходимо вставить в sdef файл. Кроме того, однако, поддержка по умолчанию обычно требует только, чтобы Ваши scriptable объекты следовали, инструкции по кодированию значения ключа, описанные в, Поддерживают Соответствие KVC и что Вы реализуете объектные методы спецификатора для своих scriptable классов, как описано в Объектных Спецификаторах.
Можно определить новые подклассы классов команды сценария Какао, чтобы изменить их поведение по умолчанию или реализовать новые команды AppleScript, определенные для приложения. Или в некоторых случаях можно просто добавить метод обработки команды для scriptable класса и предоставить информацию в sdef файле для указания, когда это нужно вызвать. Эта глава включает подробную информацию о том, как выполнить эти виды операций.
Классы команды сценария, предоставленные какао
Какао определяет классы команды сценария Objective C для реализации команд AppleScript от Стандартного комплекта. Эти классы перечислены в Таблице 9-4. Как часть стандартной реализации сценариев Какао, NSScriptCommand
и его подклассы могут обработать close
, copy
, count
, create
, delete
, exists
, move
, open
, и print
команды для большинства приложений без любого разделения на подклассы. Это также обрабатывает get
и set
команды, которые являются технически не частью Стандартного комплекта, а скорее рассмотренными встроенными, или внутренними, командами AppleScript. Однако, если Ваше приложение должно изменить какую-либо из этих команд, можно сделать так одним из двух способов:
Предоставьте метод, чтобы обработать команду и перечислить ее в Вашем sdef файле.
Создайте подкласс
NSScriptCommand
или один из его подклассов и переопределенияperformDefaultImplementation
.
Таблица 7-1 перечисляет команды AppleScript, поддерживаемые сценариями Какао, и суммирует их поведение по умолчанию и как можно настроить его.
Команда сценария информация о Scriptability
В работе с командами сценария сценарии Какао полагаются на scriptability информацию в Вашем sdef. Это включает command
элементы, предоставляющие информацию об определенных командах AppleScript, и responds-to
элементы, указывающие, что объекты определенного класса могут реагировать на указанную команду.
Ваш sdef включает a command
элемент для каждой новой команды AppleScript Вы создаете. Для этих команд Вы указываете всю надлежащую информацию, описанную в Элементах Команды. Это включает название команды, код и описание. Это может также включать прямой параметр, другие параметры, и закончиться тип.
При реализации нового класса Objective C для команды Вы также предоставляете имя в command
элемент. Если Вы не предоставляете имя класса, сценарии Какао используют значение по умолчанию, NSScriptCommand
.
Ваш sdef должен также включать command
определения элемента для большинства поддержек сценариев Какао команд AppleScript, если они могут использоваться в Вашем приложении:
Ваш sdef не должен включать
command
элементы дляget
иset
команды — они автоматически доступны каждому приложению.Ваш sdef должен включать
command
элементы для команд в Стандартном комплекте, такой какcount
,duplicate
, иmove
. Можно получить эти определения путем копирования их с файлаSketch.sdef
, как описано в Создают Файл Определения Сценариев.
Какао также предоставляет автоматическую поддержку для типов AppleScript, описанных во Встроенной Поддержке Основных Типов AppleScript.
Компоненты команды сценария
Объект команды сценария является экземпляром NSScriptCommand
или один из его подклассов, включая классы, определенные Какао и определенными Вашим приложением. Команда сценария может иметь несколько компонентов, варьирующихся командой и описанных в command
определение элемента для команды в sdef файле.
Получатель или получатели для команды (если таковые имеются): объект или объекты, определяемые для получения команды в приложении.
Если инициирующее событие Apple указывает получатели, оно делает так в его прямом параметре. Если событие Apple не указывает получатели, оно может все еще иметь прямой параметр, тогда интерпретирующийся, чтобы быть объектом, в который можно отправить команду.
Если команда указывает получатели, можно получить их от объекта команды с
evaluatedReceivers
метод, преобразовывающий объектные спецификаторы в ссылки на фактические объекты. Если команда не указывает получатели, можно получить прямой параметр сdirectParameter
метод, или можно получить его из списка параметров, как описано в следующем элементе.Параметры команды (если таковые имеются): параметры обеспечивают доступ к информации от параметров инициирующего события Apple. Параметры могут включать прямой параметр, другие параметры, и закончиться тип.
Можно получить словарь параметров от объекта команды с
evaluatedArguments
метод. Вы получаете отдельные параметры от этого словаря ключом, где названия параметра, определенные в sdef, служат ключами. Можно использовать пустой ключ (пустая строка:@""
) получать прямой параметр (или «параметр без имени») из словаря параметра, если прямой параметр не является спецификатором получателей.Описание класса для команды: Из описания класса можно получить информацию, такую как имена параметра, тип результата команды, название команды AppleScript, и имя Какао класса Objective C инстанцирует для выполнения команды. Эта информация используется сценариями Какао, но реже Вашим приложением. Посмотрите Создание Команды Сценария для описания того, как сценарии Какао получают эту информацию.
Дескриптор события Apple: Этот объект Какао, типа
NSAppleEventDescriptor
, представляет само событие Apple. Ваше приложение должно будет не обязательно работать непосредственно с событием Apple, но это доступно, если Вы делаете.
Когда Вы хотите изменить поведение по умолчанию или реализовать новую команду сценария, Ваше приложение обычно только должно получить доступ к компонентам команды. В тех ситуациях, NSScriptCommand
класс обеспечивает много методов для получения информации, в которой Вы нуждаетесь, включая упомянутых здесь (evaluatedReceivers
, evaluatedArguments
, и directParameter
).
Создание команды сценария
Важно отметить, что Ваше приложение обычно не инстанцирует команды сценария непосредственно. Вместо этого это перечисляет команды, которые это может обработать в его sdef файле, и сценарии Какао инстанцируют объекта команды, когда приложение получает соответствующее событие Apple.
Какао извлекает информацию из события Apple и хранит его в объекте команды. Чтобы сделать это, это использует приложение scriptability информация (загруженный из Вашего sdef и сохраненный в глобальном экземпляре NSScriptSuiteRegistry
) получить ключи для указанных объектов и получить данные из описаний команды и класса. Приложение scriptability информация автоматически включает информацию для поддержки get
и set
команды.
Поскольку в этой точке получатели и параметры команды, вероятно, известны только как ссылочные формы AppleScript (например, graphic 3 of document "SketchDocOne"
), они представлены в объекте команды как спецификаторы вложенного объекта. Посмотрите Команды Сценария и Объектные Спецификаторы для получения дополнительной информации.
Выполнение команды сценария
Как только сценарии Какао создали и подготовили команду сценария, они выполняют его в серии шагов:
Это использует кодирование значения ключа (KVC) для оценки спецификатора получателей в команде сценария (см. Команды Сценария и Объектные Спецификаторы для подробных данных).
Это определяет который метод использовать для выполнения команды. Для некоторых команд (такой как
get
иset
), это вызывает методы KVC, на основе ключей, предоставленных в sdef файле, к значениям доступа указанных объектов.Для других команд это смотрит в описаниях класса получателей, чтобы видеть, указал ли кто-либо селектор для команды. В противном случае или при отсутствии получателей, это выбирает реализацию по умолчанию для команды. Этот механизм описан более подробно в Объекте сначала По сравнению с Глаголом первые Команды Сценария.
Это вызывает метод, обозначенный селектором (который имеет отдельный аргумент, объект команды сценария), или метод, реализующий поведение по умолчанию для команды (
performDefaultImplementation
).Когда команда должна возвратить значение, сценарии Какао упаковывают информацию в событии Apple ответа и возвращают ее. Если ошибка происходит при выполнении команды, Какао возвращает информацию об ошибке (включая любую информацию, добавленную приложением) в событии Apple ответа. Для получения дополнительной информации посмотрите Обработку ошибок.
Если команда требует асинхронной обработки, приложение может приостановить его, так, чтобы приложение не получало дополнительные события Apple во время обработки. Для получения дополнительной информации посмотрите Приостановку и Возобновление Событий Apple и Команд Сценария.
Большинство стандартных команд выполняет свои операции автоматически. Для примера, где Вы могли бы хотеть изменить или заменить поведение по умолчанию, посмотрите Изменение Стандартной Команды.
Команды сценария и объектные спецификаторы
Когда команда сценария готова к выполнению в Вашем приложении, получатель или получатели были установлены как объектные спецификаторы, и любые параметры, возможно, также были установлены как объектные спецификаторы (параметрами могут быть фактические значения также). Представлять серию ссылочных форм (такой как first word of second paragraph of document "Stock Alert"
), каждый объектный спецификатор вкладывается в его спецификаторе контейнерного объекта; самый внутренний объектный спецификатор указывает конечный объект, который будет оценен, в то время как наиболее удаленный объект обычно является приложением.
Ключи к атрибуту или отношению часто являются не теми же словами, выраженными соответствующими ссылочными формами. Например, ключ для массива объектов документа orderedDocuments
, но фактический использованный термин сценариев document
. Отображение между ключевым именем и именем сценария предоставлено в sdef приложения. Когда сценарии Какао преобразовывают событие Apple в объективный-C объект команды сценария, они получают отображение между четырьмя кодами символа в событии Apple и соответствующим ключом для указанного класса, атрибута или отношения в приложении. Это может тогда определить местоположение независимой от языка информации (в частности, класс и описания команды) должен был составить команду сценария, включая объектные спецификаторы для ее параметров и получателей.
В нормальном ходе выполнения команды сценария приложение вызывает evaluatedReceivers
на команде сценария для получения получателя или получателей команды и вызывает evaluatedArguments
получить любые параметры команды. Эти методы поочередно вызывают objectsByEvaluatingSpecifier
на объектных спецификаторах, представляющих аргументы команды или получатели. Объектный спецификатор, получающий сообщение, является самым внутренним спецификатором, как вложено в его контейнерах.
objectsByEvaluatingSpecifier
метод восстанавливает работоспособность цепочка вложенных контейнеров путем выяснения у каждого спецификатора его контейнер, пока это не прибывает в спецификатор объекта верхнего уровня, не имеющий никакого контейнера. Объект верхнего уровня обычно является объектом приложения, но это может быть объектный спецификатор, вовлеченный в a whose
пункт (NSWhoseSpecifier
) или контейнер для оценки диапазона. Метод тогда вызывает objectsByEvaluatingWithContainers:
на этом спецификаторе верхнего уровня, тогда продолжающем вниз цепочку вложенных спецификаторов, оценивая каждого посредством кодирования значения ключа и использования оцененного объекта как основание для следующей оценки. Оценка самого внутреннего спецификатора приводит к реальному получателю команды или получателям или любому объекту, используемому в качестве аргумента команды.
Для соответствующей информации посмотрите Более внимательное рассмотрение в Объектном Спецификаторе.
Обработка ошибок
Ваше приложение может сигнализировать информацию об ошибке во время выполнения команды сценария путем обеспечения объекта команды кодом ошибки, строкой ошибки или обоими. Информация об ошибке возвращается в событии Apple ответа. Если ошибка произойдет, и Ваше приложение ничего не делает, то сценарии Какао предоставят самый применимый код ошибки, это может, вместе со строкой ошибки для того числа. Коды ошибки, что использование сценариев Какао для общекомандных проблем выполнения перечислено с документацией для NSScriptCommand
класс.
NSScriptCommand
предоставления setScriptErrorNumber:
и setScriptErrorString:
методы для установки информации об ошибке.
Ваш обработчик команды должен только предоставить ошибочную информацию, если это является определенным для работы Вашего приложения. При случае можно быть в состоянии использовать один из кодов, определенных сценариями Какао. Можно также выбрать код ошибки из констант, предоставленных менеджером по корпоративным мероприятиям Apple (описанный в “Кодах Результата менеджера по корпоративным мероприятиям Apple” в Ссылке менеджера по корпоративным мероприятиям Apple). Когда Вы выбираете одну из этих констант, такой как errAENotASingleObject
, Сценарии какао предоставят соответствующую строку ошибки ("Handler only handles single objects"
). Можно также предоставить общие числа системной ошибки Mac OS (определенный в MacErrors.h
). Например, если Вы возвращаетесь fnfErr
, код ошибки для "file not found"
, AppleScript попытается предоставить надлежащую строку ошибки.
Возразите сначала по сравнению с глаголом первым командам сценария
Команды сценария какао могут быть описаны как объект сначала или глагол сначала, в зависимости от получателей для команды. Когда команда сценария выполняется, она сначала ищет получатели, которые могут выполнить желаемое действие непосредственно. Если это находит кого-либо, это вызывает указанный метод на каждый получатель. Команду этого типа вызывают объектной первой командой — объекты выполняют указанное действие с собой.
Эскиз реализует rotate
команда как объектная первая команда — для подробных данных, посмотрите, что Вращается Реализация Объектной Первой Команды —.
Если никакой получатель не может выполнить желаемое действие, или при отсутствии указанных получателей, команда сценария вызывает performDefaultImplementation
метод. Когда команда вызывает этот метод, ее вызывают глаголом первой командой — отдельный метод выполняет действие (или глагол) на любом числе объектов. Для создания глагола первая команда Вы определяете подкласс одного из классов команды сценария Какао и переопределяете performDefaultImplementation
метод (который ни в чем не выполняет NSScriptCommand
) выполнять Вашу версию действия команды.
Эскиз реализует align
команда как глагол первая команда — для подробных данных, посмотрите Реализацию Глагола, который Выравнивает Первая Команда —. Несколько из стандартных команд являются также глаголом, первые команды — видят Таблицу 9-4 для подробных данных.
Рисунок 7-1 показывает дерево решений сценариев Какао для выполнения команды сценария.
Об объектных первых командах сценария
Можно использовать объектную первую команду для изменения поведения стандартной команды AppleScript (за исключением get
и set
команды). Можно также использовать объектную первую команду для быстрого добавления новой команды AppleScript к приложению. Для этих задач Вы не должны реализовывать новый класс команды Objective-C. Однако можно реализовать такой класс при желании — например, если Вы хотите предоставить функциональность в классе команды, который может вызвать любой из получателей.
Объектная первая команда является подходящей для действия, которое может получить преимущества от полиморфизма, потому что то же сообщение может привести к различному поведению в зависимости от получателя. Это также подходяще для операций на относительно небольших числах объектов или для простых действий, не запрашивающих периферийную информацию — например, действие, требующее простое реверсирование состояния. Несмотря на то, что каждый получатель, при необходимости, может извлечь информацию из команды для помощи в выполнении действия, такой подход мог очевидно привести к проблемам производительности при работе на большие количества объектов.
Другое преимущество использования объектной первой команды состоит в том, что можно часто реализовывать его путем создания категории на существующем классе.
Для поддержки объектной первой команды Вы выполняете следующие шаги:
В Вашем sdef обеспечьте a
responds-to
запись для каждого scriptable класса, который может обработать команду. Укажите то же имя метода для каждого класса, соответствуя шаблон<methodName>:
.Для новой команды AppleScript Вы определили, добавьте a
command
элемент к Вашему sdef файлу. Укажите всю надлежащую информацию, описанную в Элементах Команды.При определении нового класса Objective C для реализации команды, предоставьте имя класса в
command
элемент.Для использования объекта сначала приближаются для изменения поведения стандартной команды AppleScript (но не
get
иset
команды), удостоверьтесь, что Ваш sdef включаетcommand
определение элемента для той команды, как описано в Создают Файл Определения Сценариев. Вы не должны изменятьcommand
определение, если Вы не реализуете новый класс Objective C для команды.Например, если Ваш sdef включает a
responds-to
элемент, указывающий aspecialMove:
метод, который сценарии Какао должны вызвать дляmove
команда, нет никакой потребности изменитьmove
команда в Вашем sdef или разделять на подклассыNSMoveCommand
. Но если Вы действительно обеспечиваете подклассNSMoveCommand
, необходимо перечислить его вcommand
элемент.В реализации для соответствующих scriptable классов реализуйте именованный метод. Объявление метода должно соответствовать один из следующих двух шаблонов (в зависимости от того, возвращает ли команда значение):
-(id)<methodName>:(NSScriptCommand*)command
-(void)<methodName>:(NSScriptCommand*)command
Если Вы используете один, реализуете класс Objective C для команды; это должно наследоваться от одного из классов команды сценария, определенных Какао.
Для подробного примера посмотрите, что Вращается Реализация Объектной Первой Команды —.
О глаголе первые команды сценария
Первая команда глагола является подходящей для действия, требующего взаимодействия объектов, так, чтобы это не могло быть обработано отдельными объектами. Это также подходяще для операций, требующих значительных издержек, таких, что это было бы неэффективно для вызова того же метода на многие объекты с каждым дублированием издержек. Глагол первая команда может также быть надлежащим для настройки поведения существующего глагола первая команда.
Для реализации глагола первая команда Вы выполняете следующие шаги:
Для обработки новой команды AppleScript для приложения добавьте a
command
элемент для класса Вашего sdef файла. Укажите всю надлежащую информацию, описанную в Элементах Команды. Это включает указание имени Вашего нового класса Objective C, реализующего команду.Для обработки стандартной команды AppleScript с новым подклассом команды удостоверьтесь, что sdef включает
command
определение элемента для той команды (за исключениемget
иset
команды), как описано в Создают Файл Определения Сценариев. Измените тот элемент для указания имени нового класса Objective C.Определите команду в своем коде как подкласс
NSScriptCommand
или одной из команды сценария подклассы перечислил в Таблице 9-4:Подкласс
NSScriptCommand
выполнять работу, не поддерживающуюся ни одним из стандартных классов команды сценария Какао.Разделите одни на подклассы из сценариев Какао другие классы команды сценария для выполнения изменения ее стандартного действия. Например, можно хотеть выполнить пользовательское
move
работа в некоторых случаях, но иначе возвращаются к поведению по умолчанию.Переопределите
performDefaultImplementation
метод. В том методе можно использовать методыNSScriptCommand
для извлечения любой информации, Вам нужно от объекта команды.Например, можно исследовать объекты, на которых команда должна быть выполнена и решить, выполнить ли настроенную версию команды. В противном случае можно вызвать метод суперкласса:
return [super performDefaultImplementation];
Этот метод любой возвраты
id
или, если нет ничего для возврата, возвратыnil
. Версия вNSScriptCommand
не делает ничего и возвратовnil
, но большинство подклассовNSScriptCommand
переопределите этот метод для выполнения действия.
Для подробного примера посмотрите Реализацию Глагола, который Выравнивает Первая Команда —.
Смешивание объекта сначала и глагола первое поведение
При реализации нового класса команды или переопределении класса команды Cocoa, Вы могли бы принять решение смешать глагол сначала и возразить первым подходам. Например, Вы могли бы поддерживать команду, которую большинство объектов в Вашем приложении может обработать в указанном методе (возразите сначала), но что для определенного класса объектов, необходимо обработать действие в performDefaultImplementation
метод (глагол сначала).
Для реализации команды, смешивающей эти способы поведения Вы используете комбинацию тех же шагов реализации, описанных в приблизительно Объектных первых Командах Сценария и О Глаголе первые Команды Сценария. Т.е. Вы предоставляете обоим responds-to
элементы и a command
элемент в Вашем sdef файле и Вы указываете класс Objective C для команды; в Вашем коде Вы реализуете переопределяющий подкласс команды сценария performDefaultImplementation
, а также версии метода, указанного responds-to
элемент в отдельных классах, которые могут реагировать на команду. Результат обработки экземпляра команды будет тогда зависеть от типов классов объектов, на которые это воздействует.
Шаги для реализации новой или измененной команды сценария
Для суммирования от предыдущих разделов Вы используете эти шаги, чтобы реализовать новую команду или изменить поведение команд сценария, предоставленных сценариями Какао:
Для любого объект сначала (кроме
get
иset
команды) или глагол первая команда:В sdef определите a
command
элемент для команды AppleScript, если это уже не имеет того.Для объектной первой команды:
В sdef добавьте a
responds-to
элемент кclass
определение каждого scriptable класса, который может обработать команду. Укажите то же имя метода для каждого класса.Реализуйте указанный метод в классах, которые могут реагировать на команду. Объявление должно соответствовать один из этих шаблонов:
-(id)<methodName>:(NSScriptCommand*)command
-(void)<methodName>:(NSScriptCommand*)command
Для глагола первая команда (и в случае необходимости, для объектной первой команды)
Реализуйте класс команды сценария Objective C, наследовавшийся от
NSScriptCommand
или один из его подклассов.Укажите имя класса команды Objective-C в
command
элемент в sdef.
Для глагола первая команда переопределите
performDefaultImplementation
метод.
Реализация объектной первой команды — вращается
Пример приложения Эскиза реализует rotate
команда как объектная первая команда — это - логическая задача для a rectangle
объект повернуть себя.
Реализовать объектную первую команду AppleScript rotate
, приложение Эскиза делает следующее:
Это определяет
rotate
команда в файлеSketch.sdef
:<command name="rotate" code="sktcrota"
description="Rotate objects.">
<direct-parameter type="graphic"/>
<parameter name="by" code="by " type="real"
description="degrees to rotate; positive numbers rotate counter-clockwise.">
<cocoa key="byDegrees"/>
</parameter>
Вот то, что указывает это определение команды:
Название команды
"rotate"
и его код с двумя частями"sktcrota"
. Этот код используется в установке обработчика для ответа на события Apple, указывающие эту команду.Команда имеет прямой параметр, указывающий один или несколько графических объектов, которые будут повернуты.
Команда имеет параметр с ключом
"byDegrees"
это указывает градусы, на которые должны быть повернуты указанные объекты.Это определение команды не указывает класс команды для реализации команды, потому что
rotate
команда не требует нового класса команды. Поскольку это не указывает класс команды, класс по умолчанию будет использоваться (NSScriptCommand
).Это определение команды не включает a
result type
элемент, таким образом, метод Objective C, обрабатывающий команду, должен возвратитьсяnil
.
В его sdef Эскиз также добавляет a
responds-to
элемент кrectangle
класс (прямоугольники являются единственной графикой, которая может быть повернута на эту команду).<responds-to name="rotate">
<cocoa method="rotate:"/>
</responds-to>
Это определение элемента указывает это для a
rotate
команда, сценарии Какао должны вызватьrotate:
методrectangle
объект, который будет повернут.В реализации для
SKTRectangle
класс, это реализуетrotate:
метод. Вот сводка какrotate:
работы:Это вызывает
[command evaluatedArguments]
на переданном объекте команды для получения словаря (theArgs
) содержа оцененные параметры за команду. Параметры были оценены от объектных спецификаторов до объектов при необходимости. Ключи в словаре являются именами параметра, указанными в sdef.Это вызывает
[theArgs objectForKey:@"byDegrees"]
получить параметр за число градусов для вращения, как экземплярNSNumber
. Ключ"byDegrees"
соответствует ключу Cocoa, определенному для"by"
параметр вrotate
определение в sdef файле Эскиза.Это получает число градусов для вращения от объекта числа и выполняет некоторые математические операции, чтобы определить, повернуть ли прямоугольник.
В случае, что это должно повернуть прямоугольник, это делает так путем зеркального отражения ширины и высоты и изменения позиции.
Если существует ошибка, она вызывает
[self setScriptErrorNumber:theError]
предоставлять код ошибки.Можно также вызвать
setScriptErrorString:
предоставлять сообщение об ошибке.Поскольку
rotate
команда не объявляет aresult type
элемент в его sdef определении, этот метод должен возвратитьсяnil
.
Вот сценарий AppleScript, тренирующийся rotate
команда:
Перечисление 7-1 сценарий для тестирования поворачивать команды
tell application "Sketch" |
with timeout of 60 * 60 seconds |
tell document 1 |
get orientation of every rectangle |
set x to every rectangle |
repeat with y in x |
rotate y by 90 |
end repeat |
try |
rotate rectangle 1 by 80 |
on error eMsg number eNum |
log {eNum, eMsg} |
end try |
get orientation of every rectangle |
end tell |
end timeout |
end tell |
Вот то, что делает этот сценарий:
Это устанавливает длинное значение тайм-аута, таким образом, это не испытает таймаут (и будет прервано) во время выполнения, если Вы прервете приложение для отладки его поддержки scriptability.
Это выполняет серию тестов на первом документе:
Это добирается
orientation
свойство каждогоrectangle
объект.Это поворачивает каждый
rectangle
объект на 90 градусов.Это использует a
try
блокируйте для тестирования на состояние ошибки (вращающийся значением, которое не является кратным числом 90).Это добирается
orientation
свойство каждогоrectangle
объект после вращения.
Вы могли бы добавить дополнительные тесты к этому сценарию, такие как следующее:
Реализация глагола первая команда — выравнивается
Пример приложения Эскиза реализует align
команда сценария как глагол первая команда. Это целесообразно позволять performDefaultImplementation
метод выравнивает все указанные объекты в массиве объектов, тогда как выяснение у каждого объекта выровнять себя потребовало бы объектов знать или узнать о других объектах выровняться с.
Реализовать глагол первая команда AppleScript align
, приложение Эскиза делает следующее:
Это определяет
align
команда в sdef файле Эскиза<command name="align" code="sktcalig"
description="Align a set of objects.">
<cocoa class="SKTAlignCommand"/>
<direct-parameter>
<type type="graphic" list="yes"/>
</direct-parameter>
<parameter name="to" code="to " type="edge">
<cocoa key="toEdge"/>
</parameter>
</command>
Вот то, что указывает это определение команды:
Название команды
"align"
и его код с двумя частями"sktcalig"
. Этот код используется в установке обработчика для ответа на события Apple, указывающие эту команду.Для обработки команды сценарии Какао должны реализовать экземпляр
SKTAlignCommand
.Команда имеет прямой параметр, предоставляющий список графики, чтобы быть выровненный.
Команда имеет параметр, указывающий край, к которому объекты должны быть выровненные.
Это определение команды не включает a
result type
элемент, таким образом, код Objective C, обрабатывающий команду, должен возвратитьсяnil
.
В его sdef Эскиз также определяет
edge
перечисление (не показанный) для определения граничных констант для использования сalign
команда.Эскиз добавляет два файла к своему проекту XCode определить
SKTAlignCommand
класс:SKTAlignCommand.h
иSKTAlignCommand.m
.Эта команда является подклассом
NSScriptCommand
, содержа один метод,performDefaultImplementation
. Тот метод переопределяет версию вNSScriptCommand
.Вот сводка как
performDefaultImplementation
работы дляalign
команда:Это определяет получатели для команды (массив графических объектов для выравнивания).
Это вызывает
[self evaluatedArguments]
получить словарь (theArgs
) содержа оцененные параметры за команду. Параметры были оценены от объектных спецификаторов до объектов при необходимости. Ключи в словаре являются именами параметра, указанными в sdef.Это вызывает
[theArgs objectForKey:@"toEdge"]
получить параметр за край для выравнивания к. Ключ"toEdge"
соответствует ключу Cocoa, определенному для"to"
граничный параметр вalign
определение в sdef файле Эскиза.От того параметра это получает значение края для выравнивания к.
Это получает границы для первого объекта в массиве графических объектов. Это - объект, к которому любые другие объекты будут выровненные.
Это выполняет итерации по массиву графических объектов выровняться, с помощью механизма для выравнивания их, который зависит от указанного края для выравнивания к.
Если существует ошибка, она вызывает
[self setScriptErrorNumber:theError]
предоставлять код ошибки.Можно также вызвать
setScriptErrorString:
предоставлять сообщение об ошибке.Поскольку
align
команда не объявляет aresult type
элемент в его sdef определении, этот метод должен возвратитьсяnil
.
performDefaultImplementation
метод для SKTAlignCommand
никогда не вызывает реализацию его суперкласса (NSScriptCommand
) по двум причинам:
Версия в
NSScriptCommand
ничего не делает — это существует только, чтобы быть переопределенным.Реализация в
SKTAlignCommand
выполняет всю работу, необходимую для реализацииalign
команда.
Вот сценарий AppleScript, тренирующийся align
команда:
Перечисление 7-2 сценарий для тестирования выровнять команды
tell application "Sketch" |
with timeout of 60 * 60 seconds |
tell document 1 |
align every graphic to vertical centers |
delay 3 |
set x to every graphic |
align x to horizontal centers |
end tell |
end timeout |
end tell |
Вот то, что делает этот сценарий:
Это устанавливает длинное значение тайм-аута, таким образом, это не испытает таймаут (и будет прервано) во время выполнения, если Вы прервете приложение для отладки его поддержки scriptability.
Это говорит первому документу выравнивать каждую диаграмму вертикально.
После 3-секундной задержки это говорит документу выравнивать каждую диаграмму горизонтально.
Можно сделать этот сценарий тестирования больше завершенный, например, добавив операторы к:
Изменение стандартной команды
NSMoveCommand
часть встроенной поддержки сценариев Какао стандартных команд AppleScript. Это работает автоматически для поддержки move
команда посредством кодирования значения ключа. Однако существуют ситуации, где Вы могли бы хотеть переопределить эту команду, использование или глагол сначала или объект сначала приближается. Этот раздел обеспечивает некоторые подсказки для этой задачи — полное решение выходит за рамки этого документа.
Вот sdef запись для move
команда, показывающая прямой параметр и другие параметры к команде:
<command name="move" code="coremove" |
description="Move object(s) to a new location."> |
<cocoa class="NSMoveCommand"/> |
<direct-parameter type="specifier" description="the object(s) to move"/> |
<parameter name="to" code="insh" type="location specifier" |
description="The new location for the object(s)."> |
<cocoa key="ToLocation"/> |
</parameter> |
Команда первого шага глагола
Предположим, что Ваше приложение позволяет сценаристам работать с условиями такой как file
и folder
, обеспечение знакомой терминологии для доступа к данным, фактически хранящимся в базе данных. Однако Ваша конкретная реализация не делает операций поддержки на этих данных с помощью средств доступа KVC, ключи которых могут быть отображены на "file"
и "folder"
. Или возможно Вы попробовали стандарт move
поддерживайте и найденный, что Вам нужна увеличенная производительность для перемещения больших количеств объектов.
Используя глагол сначала приближаются, можно разделить на подклассы NSMoveCommand
и переопределение performDefaultImplementation
. NSMoveCommand
класс уже является глаголом первая команда, и это обычно целесообразно иметь объект более высокого уровня в Вашем приложении, контролируют перемещение содержащих в нем объектов, вместо того, чтобы говорить каждому объекту переместить себя.
В Вашем переопределении performDefaultImplementation
, можно извлечь информацию из команды и перевести его в надлежащие операции на базовых данных. Например, можно исследовать объекты переместиться:
Если они
file
илиfolder
объекты, Вы вносите надлежащие изменения в базе данных для отражения изменений, ожидаемых в пользователе (объектная модель AppleScript) представление мира.Для других объектов можно использовать следующее утверждение для применения стандартного поведения, предоставленного
NSMoveCommand
:return [super performDefaultImplementation];
Команда объектного первого шага
Предположим, с другой стороны, что определенные объекты в Вашем приложении действительно знают, как переместить себя, и они используют механизм, отличающийся от основанных на KVC перемещений, поддерживаемых NSMoveCommand
, которые работают со стандартными контейнерами. В этой ситуации Вы могли использовать объектный первый механизм для разрешения объектов определенного класса дескриптора move
управляйте непосредственно в методе, определенном для того класса.
Для реализации этого подхода Вы используете шаги, описанные ранее в приблизительно Объектных первых Командах Сценария. В Ваших методах обработчиков Вы извлекаете информацию, в которой Вы нуждаетесь от объекта команды (расположение для перемещения в), который передается в качестве параметра методу, затем выполните перемещение для текущего объекта.
Сводка поддержки команды AppleScript
Таблица 7-1 перечисляет команды AppleScript, поддерживаемые сценариями Какао. Для каждой команды это показывает класс Objective C, выполняющий команду. Это также описывает обработку значения по умолчанию для команды и как настроить его.
Хотя не упомянутый в таблице, для классов, рекомендующих глаголу первую модификацию, можно обычно использовать объект, сначала приближаются также. Если Вы хотите изменить поведение на основе класса классом, это особенно полезно.
Помните также, что большинство команд сценария Какао полагается на Вас, чтобы поддержать KVC-соответствие в именовании scriptable свойств в Ваших scriptable классах, и в некоторых случаях реализовать объектные методы спецификатора для тех классов. Иначе, команды не могут идентифицировать объекты в Вашем приложении, на котором можно управлять, или получить или установить значения в тех объектах.
Для получения дополнительной информации об обработке по умолчанию посмотрите События Apple, Отправленные Mac OS.
Команда AppleScript | Класс Objective C | Поддержка по умолчанию и как настроить его |
---|---|---|
| Какао, пишущее сценарий автоматически, обрабатывает Поддерживать | |
| Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария. | |
| Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария. | |
| Обработанный глаголом вызывающая первая команда | |
| Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария. | |
| Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария. Вам не нужен a | |
| Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария. | |
| Обработанный глаголом первая команда. Настройте путем реализации или глагола сначала или возразите первому подходу, как описано в Изменении Стандартной Команды. | |
| Какао автоматически обрабатывает | |
| Какао автоматически обрабатывает | |
| | |
| Какао автоматически обрабатывает Поддерживать | |
| Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария. Вам не нужен a |