2

これは、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 関数を呼び出して現在の花の配列をフェッチし、flowersclass の新しい Cocoa オブジェクトをインスタンス化し、元のオブジェクトと新しく作成したオブジェクトを含む配列をScriptableFlower呼び出します。setFlowers:(NSArray*)

ただし、これは私のアプリケーションには適していません。スクリプト エンジンがスクリプト可能なクラスのオブジェクトを自由に作成することはできません。

代わりに、私がそれらをインスタンス化する必要があります。

中途半端な解決策は、デフォルトの-(id)initメソッドを実装し、それが私によって呼び出されたかどうかを検出することです。そうでない場合は、追加の手順を実行できます。しかし、それはきれいではありません。スクリプト エンジンに新しいオブジェクトをまったく作成させずに、オブジェクトを「どこか」で既に準備している可能性があるため、自分でそれらを提供します。

Cocoa Scripting には、新しいスクリプト可能なオブジェクトを作成する必要があるときはいつでも私を呼び出すようにする規定がありますか?

アップデート

明確にするために:Cocoa Scripting docsは、特別な挿入ハンドラー(insertObject:in<Key>AtIndex:)を実装できるため、NSArray全体を取得する必要はありませんが、それでもスクリプトエンジンがオブジェクトを作成することにつながると説明しています。ただし、代わりにオブジェクトを作成するように依頼する必要があります。

4

2 に答える 2

1

このファイルNSObjectScripting.hは、次の機能を提供します。

- (id)newScriptingObjectOfClass:(Class)objectClass forValueForKey:(NSString *)key withContentsValue:(id)contentsValue properties:(NSDictionary *)properties;

OS X 10.5 以降で利用可能で、次のように文書化されています。

キーによって識別されるリレーションシップに挿入されるスクリプト可能なクラスの新しいインスタンスを作成し、contentsValue とそのプロパティを設定して、それを返します。または、失敗した場合は nil を返します。contentsValue とプロパティは、Make コマンドの「with contents」パラメータと「with properties」パラメータから派生します。contentsValue は nil の場合があります。このメソッドが Cocoa によって呼び出されるとき、contentsValue もプロパティも、スクリプトのキー値コーディングの -coerceValue:forKey: メソッドを使用してまだ強制されていません。ただし、.sdef で宣言されたスクリプト可能性では、渡されたオブジェクトの型は、関連する .sdef 宣言と確実に一致します。

于 2016-03-27T13:47:06.453 に答える