Проблемы с созданием приложения для какао AppleScript-scriptable

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

Приложение не основано на документах и ​​имеет несколько глобальных именованных объектов того же класса, к которым я хочу получить доступ из AppleScript. Например, скажем, что я хочу иметь несколько каталогов, каждый из которых называется "животные", "растения", "автомобили". Мне удалось добавить несколько свойств в класс приложения (в AppleScript), каждое из которых представляет один из каталогов:

<class name="application" description="My application." code="capp" inherits="application">
  <cocoa class="NSApplication"/>
  <property name="animals catalogue" code="acat" description="…" type="catalogue" access="r">
    <cocoa key="animalsCatalogue"/>
  </property>
  <property name="cars catalogue" code="ccat" description="…" type="catalogue" access="r">
    <cocoa key="carsCatalogue"/>
  </property>
  <property name="plants catalogue" code="pcat" description="…" type="catalogue" access="r">
    <cocoa key="plantsCatalogue"/>
  </property>
</class>

Я могу успешно получить любую из этих переменных, например,

tell application "MyApp"
  set c to get animals catalogue
end tell

получает меня действительно переменную каталога («class ����» "Animals" of application "MyApp").

К сожалению, когда дело доходит до получения свойства из каталога, например, "пусто", то становится сложнее. Вот определение каталога:

<class name="catalogue" code="ctlg" description="...">
    <cocoa class="XYCatalogue"/>
    <property name="empty" code="empt" description="Is the catalogue empty?" type="boolean" access="r">
        <cocoa key="isEmpty"/>
    </property>
</class>

Проблема здесь в том, что при запуске этого AppleScript:

tell application "MyApp"
  set c to get animals catalogue
  get empty of c
end tell

приводит к ошибке: MyApp got an error: Can’t make «class ����» "Animals" into type specifier.

Что касается реализации, у меня есть подкласс NSApplication (и да, я указал основной класс в Info.plist), который реализует несколько методов, возвращающих эти конкретные каталоги. XYCatalogue класс реализует -objectSpecifier метод так:

return [[[NSNameSpecifier alloc] initWithContainerClassDescription:
                  [NSScriptClassDescription classDescriptionForClass:[NSApp class]]
                               containerSpecifier:nil 
                               key:@"allCatalogues" 
                               name:[self name]] autorelease];

Подкласс NSApplication реализует -allCatalogues метод, который возвращает все каталоги. Я пытался даже с помощью NSUniqueIDSpecifier и NSPropertySpecifier, Все напрасно. И да, подкласс NSApplication действительно реализует оба -valueWithName:inPropertyWithKey: а также -valueInAllCataloguesWithName: методы, и ни один не вызывается (иметь точки останова в обоих).

Я искренне прочитал руководство Apple несколько раз, однако до сих пор не могу понять, в чем проблема, и я держусь на этом в течение нескольких дней. Я был бы очень благодарен за любой толчок в правильном направлении. Спасибо!

1 ответ

Решение

Тот факт, что вы не видите правильное название класса, например, каталог животных, но вместо этого видите «class» код является хорошим индикатором того, что ваш -objectSpecifier Функция возвращает неправильный спецификатор.

Есть важное правило, которому нужно следовать -objectSpecifier:

Ключ передан -initWithContainerClassDescription: должен быть таким же, как тот, который введен для определения свойства для этого класса в <cocoa key>, Однако в вашем примере они не совпадают: средство доступа к свойству называется animalsCatalogue, но ключ, который вы используете в -objectSpecifier есть все каталоги. Они должны соответствовать.

Кроме того, как говорят в Apple, containerSpecifier может быть только nil если целью является приложение, но не для каких-либо других объектов сценариев. Механизм сценариев Cocoa, вероятно, не будет сообщать об этом как об ошибке, если вы передадите nil для объекта, не относящегося к приложению, но результаты будут аналогичны передаче неправильного ключа.

Другие вопросы по тегам