これは、Cocoa Scripting を使用したスクリプト可能なアプリケーションの実装に関する質問です。
私のアプリのスクリプト可能なapplication
オブジェクトには、カスタム クラスの要素が含まれていflower
ます。
.sdef ファイルでは、 の Cocoa クラスがflower
として指定されていScriptableFlower
ます。
Applescript では、次のように記述できます。
tell app "myapp"
get flowers
end tell
私のコードは、花を取得するためのアクセサ関数を提供します: -(NSArray*)flowers
.
今、私は新しい花を追加する方法を実装したいので、次のように書くことができます:
tell app "myapp"
make new flower
end tell
これのデフォルトの動作は、「make」を使用するデフォルトの Core スイート ハンドラを使用するNSCreateCommand
と、次のようになります。
スクリプト エンジンは、 my 関数を呼び出して現在の花の配列をフェッチし、flowers
class の新しい Cocoa オブジェクトをインスタンス化し、元のオブジェクトと新しく作成したオブジェクトを含む配列をScriptableFlower
呼び出します。setFlowers:(NSArray*)
ただし、これは私のアプリケーションには適していません。スクリプト エンジンがスクリプト可能なクラスのオブジェクトを自由に作成することはできません。
代わりに、私がそれらをインスタンス化する必要があります。
中途半端な解決策は、デフォルトの-(id)init
メソッドを実装し、それが私によって呼び出されたかどうかを検出することです。そうでない場合は、追加の手順を実行できます。しかし、それはきれいではありません。スクリプト エンジンに新しいオブジェクトをまったく作成させずに、オブジェクトを「どこか」で既に準備している可能性があるため、自分でそれらを提供します。
Cocoa Scripting には、新しいスクリプト可能なオブジェクトを作成する必要があるときはいつでも私を呼び出すようにする規定がありますか?
アップデート
明確にするために:Cocoa Scripting docsは、特別な挿入ハンドラー(insertObject:in<Key>AtIndex:
)を実装できるため、NSArray全体を取得する必要はありませんが、それでもスクリプトエンジンがオブジェクトを作成することにつながると説明しています。ただし、代わりにオブジェクトを作成するように依頼する必要があります。