2

アプリをスクリプト可能にしたいのですが、いくつかの問題が発生しています。アプリをスクリプト可能にする経験があまりないので、助けてくれることを願っています。

アプリはドキュメントベースではなく、AppleScript からアクセスしたい同じクラスのグローバルな名前付きオブジェクトがいくつかあります。たとえば、「動物」、「植物」、「車」など、それぞれに名前が付けられたいくつかのカタログが必要だとします。アプリケーション クラスに (AppleScript で) いくつかのプロパティを追加することができました。それぞれがカタログの 1 つを表しています。

<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 のガイドを何度か読み返しましたが、まだ問題がどこにあるのかわからず、数日間この問題に取り組んでいます。正しい方向への微調整に最も感謝します。ありがとう!

4

1 に答える 1

2

動物カタログなどの適切なクラス名が表示されず、代わりに«class»コードが表示されるという事実は、-objectSpecifier関数が間違った指定子を返していることを示しています。

従わなければならない重要なルールがあります-objectSpecifier

に渡されるキーは-initWithContainerClassDescription:、 でそのクラスのプロパティ定義に入力したものと同じである必要があります<cocoa key>。ただし、あなたの例では一致しません。プロパティアクセサーはanimalCatalogueと呼ばれますが、使用するキー-objectSpecifierallCataloguesです。それらは一致する必要があります。

また、Apple docs が言うように、ターゲットがアプリケーションである場合にcontainerSpecifierのみ可能性nilがありますが、他のスクリプト可能なオブジェクトの場合はそうではありません。アプリケーション以外のオブジェクトに nil を渡した場合、Cocoa Scripting エンジンはおそらくこれをエラーとして報告しませんが、結果は間違ったキーを渡した場合と同様になります。

于 2016-04-01T12:09:03.083 に答える