2016-03-26 5 views
2

これは、Cocoa Scriptingを使ってスクリプト化可能なアプリケーションを実装することについての質問です。私のスクリプト可能なアプリケーションで自分自身のオブジェクトを提供する

私のアプリのスクリプト可能なapplicationオブジェクトには、カスタムクラスの要素が含まれています。これをflowerとします。

.sdefファイルでは、flowerのCocoaクラスはScriptableFlowerと指定されています。 AppleScriptでは

、1は今書くことができます:-(NSArray*)flowers

tell app "myapp" 
    get flowers 
end tell 

を私のコードは、花を取得するためのアクセサ機能を提供します。

は今、私は1つを書くことができるように、新しい花を追加する方法を実装したい:

tell app "myapp" 
    make new flower 
end tell 

このデフォルトの動作を、NSCreateCommandを使用して「作る」のデフォルトのコアスイートハンドラで、あります次のように:

スクリプトエンジンは、私のflowers関数を呼び出して、花の現在の配列を取得し、その後、クラスScriptableFlowerの新しいココアオブジェクトをインスタンス化して、私の元のオブジェクトを含む配列に加えて、新たに作成したものでsetFlowers:(NSArray*)を呼び出します。

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

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

半分の解決策は、デフォルトの-(id)initメソッドを実装して、それが私に呼び出されたかどうかを検出することです。そうでない場合は、余分な手順を取ることができます。しかし、それはきれいではありません。むしろスクリプトエンジンが新しいオブジェクトを作成するのではなく、オブジェクトを「どこかで」用意しておくことで、自分自身でオブジェクトを作成することができます。

私は新しいスクリプト可能オブジェクトを作成したいと思うときはいつでも、私に電話をかけるいくつかの手段がCocoa Scriptingにありますか?

更新

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

答えて

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によって呼び出されると、スクリプトキー値コーディングの-coerceValue:forKey:メソッドを使用してcontentsValueやプロパティは強制的に強制されません。 .sdefで宣言されたスクリプト性では、渡されたオブジェクトの型は、関連する.sdef宣言と確実に一致します。

0

1つのオプションは、NSCreateCommandをサブクラス化し、独自のロジックを実装することです。

関連する問題