Команды сценария

Какао, пишущее сценарий объектов команды сценария использования для обработки связанные со сценариями события 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"), они представлены в объекте команды как спецификаторы вложенного объекта. Посмотрите Команды Сценария и Объектные Спецификаторы для получения дополнительной информации.

Выполнение команды сценария

Как только сценарии Какао создали и подготовили команду сценария, они выполняют его в серии шагов:

  1. Это использует кодирование значения ключа (KVC) для оценки спецификатора получателей в команде сценария (см. Команды Сценария и Объектные Спецификаторы для подробных данных).

  2. Это определяет который метод использовать для выполнения команды. Для некоторых команд (такой как get и set), это вызывает методы KVC, на основе ключей, предоставленных в sdef файле, к значениям доступа указанных объектов.

    Для других команд это смотрит в описаниях класса получателей, чтобы видеть, указал ли кто-либо селектор для команды. В противном случае или при отсутствии получателей, это выбирает реализацию по умолчанию для команды. Этот механизм описан более подробно в Объекте сначала По сравнению с Глаголом первые Команды Сценария.

  3. Это вызывает метод, обозначенный селектором (который имеет отдельный аргумент, объект команды сценария), или метод, реализующий поведение по умолчанию для команды (performDefaultImplementation).

  4. Когда команда должна возвратить значение, сценарии Какао упаковывают информацию в событии Apple ответа и возвращают ее. Если ошибка происходит при выполнении команды, Какао возвращает информацию об ошибке (включая любую информацию, добавленную приложением) в событии Apple ответа. Для получения дополнительной информации посмотрите Обработку ошибок.

  5. Если команда требует асинхронной обработки, приложение может приостановить его, так, чтобы приложение не получало дополнительные события 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 показывает дерево решений сценариев Какао для выполнения команды сценария.

Рисунок 7-1  , Выполняющий команду сценария — глагол сначала по сравнению с объектом сначала
Executing a script command—verb-first versus object-first

Об объектных первых командах сценария

Можно использовать объектную первую команду для изменения поведения стандартной команды 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 элемент, указывающий a specialMove: метод, который сценарии Какао должны вызвать для 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, приложение Эскиза делает следующее:

  1. Это определяет 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>

    Вот то, что указывает это определение команды:

    1. Название команды "rotate" и его код с двумя частями "sktcrota". Этот код используется в установке обработчика для ответа на события Apple, указывающие эту команду.

    2. Команда имеет прямой параметр, указывающий один или несколько графических объектов, которые будут повернуты.

    3. Команда имеет параметр с ключом "byDegrees" это указывает градусы, на которые должны быть повернуты указанные объекты.

    4. Это определение команды не указывает класс команды для реализации команды, потому что rotate команда не требует нового класса команды. Поскольку это не указывает класс команды, класс по умолчанию будет использоваться (NSScriptCommand).

    5. Это определение команды не включает a result type элемент, таким образом, метод Objective C, обрабатывающий команду, должен возвратиться nil.

  2. В его sdef Эскиз также добавляет a responds-to элемент к rectangle класс (прямоугольники являются единственной графикой, которая может быть повернута на эту команду).

                <responds-to name="rotate">
                    <cocoa method="rotate:"/>
                </responds-to>

    Это определение элемента указывает это для a rotate команда, сценарии Какао должны вызвать rotate: метод rectangle объект, который будет повернут.

  3. В реализации для SKTRectangle класс, это реализует rotate: метод. Вот сводка как rotate: работы:

    1. Это вызывает [command evaluatedArguments] на переданном объекте команды для получения словаря (theArgs) содержа оцененные параметры за команду. Параметры были оценены от объектных спецификаторов до объектов при необходимости. Ключи в словаре являются именами параметра, указанными в sdef.

    2. Это вызывает [theArgs objectForKey:@"byDegrees"] получить параметр за число градусов для вращения, как экземпляр NSNumber. Ключ "byDegrees" соответствует ключу Cocoa, определенному для "by" параметр в rotate определение в sdef файле Эскиза.

    3. Это получает число градусов для вращения от объекта числа и выполняет некоторые математические операции, чтобы определить, повернуть ли прямоугольник.

    4. В случае, что это должно повернуть прямоугольник, это делает так путем зеркального отражения ширины и высоты и изменения позиции.

    5. Если существует ошибка, она вызывает [self setScriptErrorNumber:theError] предоставлять код ошибки.

      Можно также вызвать setScriptErrorString: предоставлять сообщение об ошибке.

    6. Поскольку rotate команда не объявляет a result 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

Вот то, что делает этот сценарий:

  1. Это устанавливает длинное значение тайм-аута, таким образом, это не испытает таймаут (и будет прервано) во время выполнения, если Вы прервете приложение для отладки его поддержки scriptability.

  2. Это выполняет серию тестов на первом документе:

    1. Это добирается orientation свойство каждого rectangle объект.

    2. Это поворачивает каждый rectangle объект на 90 градусов.

    3. Это использует a try блокируйте для тестирования на состояние ошибки (вращающийся значением, которое не является кратным числом 90).

    4. Это добирается orientation свойство каждого rectangle объект после вращения.

Вы могли бы добавить дополнительные тесты к этому сценарию, такие как следующее:

  1. Попытайтесь вращаться различными градусами.

  2. Попытайтесь повернуть объекты, которые не являются прямоугольниками.

  3. Удалите всю графику, затем попытайтесь вращаться без прямоугольников в документе.

  4. Поверните каждый прямоугольник путем зеркального отражения его свойства ориентации.

Реализация глагола первая команда — выравнивается

Пример приложения Эскиза реализует align команда сценария как глагол первая команда. Это целесообразно позволять performDefaultImplementation метод выравнивает все указанные объекты в массиве объектов, тогда как выяснение у каждого объекта выровнять себя потребовало бы объектов знать или узнать о других объектах выровняться с.

Реализовать глагол первая команда AppleScript align, приложение Эскиза делает следующее:

  1. Это определяет 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>

    Вот то, что указывает это определение команды:

    1. Название команды "align" и его код с двумя частями "sktcalig". Этот код используется в установке обработчика для ответа на события Apple, указывающие эту команду.

    2. Для обработки команды сценарии Какао должны реализовать экземпляр SKTAlignCommand.

    3. Команда имеет прямой параметр, предоставляющий список графики, чтобы быть выровненный.

    4. Команда имеет параметр, указывающий край, к которому объекты должны быть выровненные.

    5. Это определение команды не включает a result type элемент, таким образом, код Objective C, обрабатывающий команду, должен возвратиться nil.

    В его sdef Эскиз также определяет edge перечисление (не показанный) для определения граничных констант для использования с align команда.

  2. Эскиз добавляет два файла к своему проекту XCode определить SKTAlignCommand класс: SKTAlignCommand.h и SKTAlignCommand.m.

    Эта команда является подклассом NSScriptCommand, содержа один метод, performDefaultImplementation. Тот метод переопределяет версию в NSScriptCommand.

  3. Вот сводка как performDefaultImplementation работы для align команда:

    1. Это определяет получатели для команды (массив графических объектов для выравнивания).

    2. Это вызывает [self evaluatedArguments] получить словарь (theArgs) содержа оцененные параметры за команду. Параметры были оценены от объектных спецификаторов до объектов при необходимости. Ключи в словаре являются именами параметра, указанными в sdef.

    3. Это вызывает [theArgs objectForKey:@"toEdge"] получить параметр за край для выравнивания к. Ключ "toEdge" соответствует ключу Cocoa, определенному для "to" граничный параметр в align определение в sdef файле Эскиза.

      От того параметра это получает значение края для выравнивания к.

    4. Это получает границы для первого объекта в массиве графических объектов. Это - объект, к которому любые другие объекты будут выровненные.

    5. Это выполняет итерации по массиву графических объектов выровняться, с помощью механизма для выравнивания их, который зависит от указанного края для выравнивания к.

    6. Если существует ошибка, она вызывает [self setScriptErrorNumber:theError] предоставлять код ошибки.

      Можно также вызвать setScriptErrorString: предоставлять сообщение об ошибке.

    7. Поскольку align команда не объявляет a result type элемент в его sdef определении, этот метод должен возвратиться nil.

performDefaultImplementation метод для SKTAlignCommand никогда не вызывает реализацию его суперкласса (NSScriptCommand) по двум причинам:

Вот сценарий 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

Вот то, что делает этот сценарий:

  1. Это устанавливает длинное значение тайм-аута, таким образом, это не испытает таймаут (и будет прервано) во время выполнения, если Вы прервете приложение для отладки его поддержки scriptability.

  2. Это говорит первому документу выравнивать каждую диаграмму вертикально.

  3. После 3-секундной задержки это говорит документу выравнивать каждую диаграмму горизонтально.

Можно сделать этот сценарий тестирования больше завершенный, например, добавив операторы к:

  1. Протестируйте другие опции выравнивания, определенные в sdef Эскиза: left edges, right edges, horizontal centers, top edges, и bottom edges.

  2. Выровняйте диапазон графики.

  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.

Табличная 7-1  поддержка Значения по умолчанию команд AppleScript и как настроить его

Команда AppleScript

Класс Objective C

Поддержка по умолчанию и как настроить его

close

NSCloseCommand

Какао, пишущее сценарий автоматически, обрабатывает close для окон и документов, с версией окна, обычно передающей управление к документу окна. Настройте путем переопределения handleCloseScriptCommand: метод в подклассе NSDocument или NSWindow, В зависимости от объекта. (См. также документацию для NSWindowScripting.)

Поддерживать close для различного класса можно использовать механизм, описанный в приблизительно Объектных первых Командах Сценария.

count

NSCountCommand

Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария.

delete

NSDeleteCommand

Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария.

duplicate

NSCloneCommand

Обработанный глаголом вызывающая первая команда copyWithZone: на объектах, которые будут дублированы. Настройте в своей реализации того метода, или путем реализации глагола сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария.

exists

NSExistsCommand

Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария.

get

NSGetCommand

Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария.

Вам не нужен a command элемент в Вашем sdef файле для get команда.

make

NSCreateCommand

Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария.

move

NSMoveCommand

Обработанный глаголом первая команда. Настройте путем реализации или глагола сначала или возразите первому подходу, как описано в Изменении Стандартной Команды.

open documents

NSScriptCommand

Какао автоматически обрабатывает open documents путем вызова методов, описанных в Открытом. Можно изменить поведение по умолчанию путем реализации или переопределения тех методов.

print documents

NSScriptCommand

Какао автоматически обрабатывает print для документов путем вызова методов описан в Печати. Можно изменить поведение по умолчанию путем реализации или переопределения тех методов.

quit

NSQuitCommand

NSApplication класс автоматически обрабатывает эту команду для приложений путем вызова методов, описанных в Выходе. Можно изменить поведение по умолчанию путем реализации или переопределения тех методов.

save

NSScriptCommand

Какао автоматически обрабатывает save для окон и документов, с версией окна, обычно передающей управление к документу окна. Настройте поведение сохранения путем переопределения handleSaveScriptCommand: метод в подклассе NSDocument или NSWindow, В зависимости от объекта. (См. также документацию для NSWindowScripting.)

Поддерживать save для различного класса можно использовать механизм, описанный в приблизительно Объектных первых Командах Сценария.

set

NSSetCommand

Обработанный глаголом первая команда. Настройте путем реализации глагола, сначала разделяют на подклассы, как описано в приблизительно Глаголе первые Команды Сценария.

Вам не нужен a command элемент в Вашем sdef файле для set команда.