問題タブ [cocoa-scripting]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - スクリプト可能なアプリで任意のAppleScriptレコードをCocoaに渡す方法は?
.sdefXMLファイルで記述されたAppleScriptディクショナリを備えたCocoaアプリケーションがあります。sdefで定義されているすべてのAppleScriptクラス、コマンドなどは動作プロパティです。
私の「フォームの送信」コマンドを除いて。「submitform」コマンドは、AppleScriptからCocoaへの情報の任意のハッシュテーブルであるパラメータを渡そうとする私の唯一のコマンドです。これは、Cocoa側でrecord
自動的に変換されるAppleScriptを渡すことによって実行する必要があると思います。NSDictionary
「withvalues」パラメータは、問題が発生しているrecord
->NSDictionary
パラメータです。レコード/辞書のキーを事前に知る/定義することはできないことに注意してください。それらは任意です。
これが私のsdefXMLでのこのコマンドの定義です。
そして、sdefにこのコマンドに応答する「tab」オブジェクトがあります。
とココア:
「tab」オブジェクトは、私が定義した他のすべてのAppleScriptコマンドに正しく応答します。オプションの「withvalues」パラメータを送信しない場合、「tab」オブジェクトは「submitform」コマンドにも応答します。だから私は基本的なセットアップが正しく行われていることを知っています。唯一の問題は、任意のrecord
->NSDictionary
パラメータのようです。
上記のAppleScriptをで実行するとAppleScript Editor.app
、Cocoa側で次のエラーが発生します。
そしてこれはAppleScript側にあります:
誰かが私が欠けているものを教えてもらえますか?参考までに、アプリケーション全体はGitHubのオープンソースです。
objective-c - cocoa アプリケーションをスクリプト可能にする
私はココア開発に不慣れです。ココアアプリケーションをスクリプト可能にする方法を教えてください。スクリプトに応答して、アプリケーションが特定のアクションを実行するようにします。簡単なガイドやヘルプが見つかりませんでした。
objective-c - スクリプト可能な Cocoa アプリケーションを作成する簡単なチュートリアル (スクリプト ブリッジ)
ScriptingBridge を導入する本当に単純なHello Worldタイプのアプリケーションを誰か教えてもらえますか? ruby/python/applescript などからインスタンス化できる 1 クラス - 1 メソッド プロジェクトを作成するための手順を説明します。
スクリプト可能なココア アプリを作成するために実際に何が必要なのかを理解するのに苦労しており、具体的な例やチュートリアルを見つけることができませんでした。
objective-c - NSObject から派生した Cocoa アプリケーションにスクリプト可能なプロパティを追加?
誰かがこの作業の例を教えてくれますか? AppleScript を介してプロパティ値を設定したいだけです。設定が異なるスクリプト可能な例をすべて確認しました。
ヘッダファイル:
// Applescript がプロパティ "myInt" を設定しようとしています
最終的に、delegateHandlesKey メソッドが呼び出され、プロパティの値を返すことができますが、setter は呼び出されません。前もって感謝します...
objective-c - Cocoa アプリを AppleScript スクリプト可能にする際の問題
アプリをスクリプト可能にしたいのですが、いくつかの問題が発生しています。アプリをスクリプト可能にする経験があまりないので、助けてくれることを願っています。
アプリはドキュメントベースではなく、AppleScript からアクセスしたい同じクラスのグローバルな名前付きオブジェクトがいくつかあります。たとえば、「動物」、「植物」、「車」など、それぞれに名前が付けられたいくつかのカタログが必要だとします。アプリケーション クラスに (AppleScript で) いくつかのプロパティを追加することができました。それぞれがカタログの 1 つを表しています。
これらの変数のいずれかを正常に取得できます。たとえば、
本当にカタログ変数 ( «class ����» "Animals" of application "MyApp"
) を取得します。
残念ながら、カタログからプロパティを取得する場合は注意が必要です。たとえば、「空」です。カタログの定義は次のとおりです。
ここでの問題は、この AppleScript を実行するときです。
エラーが発生します。MyApp got an error: Can’t make «class ����» "Animals" into type specifier.
実装に関しては、NSApplication をサブクラス化し (そして、Info.plist でメイン クラスを指定しました)、いくつかのメソッドを実装し、それらの特定のカタログを返します。このXYCatalogue
クラスは、次の-objectSpecifier
方法でメソッドを実装します。
NSApplication サブクラスは、-allCatalogues
すべてのカタログを返すメソッドを実装します。と を使ってみましNSUniqueIDSpecifier
たがNSPropertySpecifier
、すべて無駄でした。はい、NSApplication サブクラスはメソッド-valueWithName:inPropertyWithKey:
と-valueInAllCataloguesWithName:
メソッドの両方を実装し、どちらも呼び出されません (両方にブレークポイントがあります)。
Apple のガイドを何度か読み返しましたが、まだ問題がどこにあるのかわからず、数日間この問題に取り組んでいます。正しい方向への微調整に最も感謝します。ありがとう!
objective-c - レコードタイプを Applescript に返す (objective-C から)
Applescript にレコードを返そうとしています。現在の解決策は、NSDictionary を返し、sdef ファイルでレコード タイプ (Lyx の戻り値) を定義することですが、これは機能しません。特定の AppleScript オブジェクトを作成する必要がありますか?
ここにsdefファイルがあります
ここに客観的なCコードがあります
この単純な aplescript を試してみると
エラー メッセージは次のとおりerror "Can’t get message of {message:\"\", code:0}." number -1728 from message of {«class mess»:"", «class code»:0}
です。
macos - -objectSpecifier でキー Key を使用して NSUniqueIDSpecifier を返すと、valueIn が返されないWithUniqueID: 評価される
クラス NSUniqueIdentifierのリファレンス ドキュメントでは、一意の ID 指定子が次のスキームで評価されると主張しています。
コンテナーが、
valueIn<Key>WithUniqueID:
スクリプトのキー値コーディングによって確立された関連パターンと一致するセレクターを持つメソッドを実装する場合、そのメソッドが呼び出されます。この方法は非常に高速である可能性があり、比較的簡単に実装できます。スクリプト オブジェクト指定子を評価する場合と同様に、指定されたオブジェクトのコンテナーには、オブジェクト指定子を評価する機会が与えられます。コンテナー クラスがメソッドを実装する場合
indicesOfObjectsByEvaluatingObjectSpecifier:
、メソッドが呼び出されます。この方法は非常に高速になる可能性がありますが、実装は比較的困難です。関連する 'ID' 属性が ID と一致する最初の
NSWhoseSpecifier
オブジェクトを指定するオブジェクトが合成され、評価されます。オブジェクトは、コンテナ内のNSWhoseSpecifier
すべてのキー付き要素を検索して、一致を探す必要があります。検索は非常に遅くなる可能性があります。
ただし、valueIn<Key>WithUniqueID:
呼び出されることはありません。例を挙げると、オブジェクト指定子を次のように記述するクラスがあります。
コンテナー クラスで定義した- (id)valueInAllObjectsWithUniqueID:(NSString *)uniqueID
メソッドは、私が定義したメソッドです。
コンテナに対応するクラスでは、-respondsToSelector:
これをさらにデバッグするためにオーバーライドし、上記の呼び出しのindicesOfObjectsByEvaluatingObjectSpecifier:
直後にスクリプト システムがクエリを実行する唯一の関連メソッドがある-objectSpecifier
ことを確認します (コンテナ クラスの説明と nil 以外の結果を返すことが確認されました)オブジェクト指定子が評価された直後にメソッド呼び出しを受け取るコンテナーのクラスと一致するコンテナー指定子)。
何か案は?これは OSX Mavericks (10.9.4) にあります。
objective-c - SWIFT で NSAppleEventDescriptor をアンラップできません
私は結果を与えるApplescriptを持っています。しかし、値を文字列にワープすることができないので、それを使用できます。
NSLog は次のようになります。
実際の結果は文字列「test.swift」です。この結果をアンラップ/解析するにはどうすればよいですか?
これを追加してみました:
また、メソッドを使用してみましたdescriptorForKeyword(<#keyword: AEKeyword#>)
が、AEKeywordを設定するホットがわかりません。
objective-c - Cocoa Scripting: オブジェクト ファーストのメッセージ呼び出しをインターセプトする
私は、Cocoa Scripting に関する独自の非 ObjC フレームワークを作成しています (C、C++、Java、または私の場合は Xojo でスクリプト可能な Mac アプリを作成することを考えてください)。
ObjC クラスに実際のメソッドを追加する代わりに、オブジェクト ファーストのメソッド呼び出しをインターセプトできるようにしたいと考えています (フレームワークは、アプリ コードがどのメッセージを処理できるかを事前に認識できないため、できません。代わりに、スクリプト エンジンから受信したコマンド メッセージを受信して渡す必要があります)。
たとえば、プロパティのゲッターとセッターは、実装によって傍受できます。
NSScriptKeyValueCoding
プロトコルのすべてのメソッドと同様に。
NSCommandScript
これらの sdef 要素で指定されたメソッドに送信されたメッセージを傍受する同様の方法を探しています。
したがって、reloadList:
クラスメソッドに追加して実装する代わりに、そのような呼び出しをすべてキャッチする一般的な方法があるかどうか疑問に思います。
クラスメソッドが
を求めて呼び出されreloadList:
ます。しかし、同じメソッドは他の多くの目的でも呼び出されます。そのため、そのようなすべての呼び出しをやみくもにインターセプトすることはしません。なぜなら、それらすべてをJava関数に転送して、必要かどうかを伝えるとパフォーマンスが大幅に低下するからです。たとえば、それを処理します。
さらに転送する前に、このセレクターが NSScriptCommand に関連していることを伝える何かがあることを願っています。
macos - スクリプト可能な Mac アプリケーション (Cocoa Scripting) で「スタイル付きテキスト」をサポート
私のアプリは、Applescript によるスクリプト化をサポートしています。
NSAttributedString オブジェクトに格納されたスタイル付きテキスト コンテンツを Applescript ユーザーが利用できるようにしようとしています。
NSString クラスを使用してプレーン テキストを提供するのと同じように、NSAttributedString クラスを使用してスタイル付きテキストを単純に提供できると考えましたが、それは機能しません。Cocoa Scripting は、データを変換または強制できないと報告します。
何か足りないのでしょうか、それとも Cocoa Scripting でサポートされている標準クラスでは不可能なのでしょうか?
次の例に示すように、AppleScript は「スタイル付きテキスト」タイプを認識します。
では、AppleScript がデフォルトでこの型を認識しているのであれば、Cocoa Scripting エンジンもそれを何らかの形でサポートすべきではないでしょうか?