Проблемы с созданием приложения для какао 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 для объекта, не относящегося к приложению, но результаты будут аналогичны передаче неправильного ключа.