0

Objective-C-appscript (objc-appscript) を使用してメールと対話するアプリを作成しています。現在選択されているメール メッセージのコピーを作成し、後で処理を実行したいのですが、その時点で現在の選択が変更されている可能性があります。

MLApplication *mail = [[MLApplication alloc] initWithBundleID: @"com.apple.mail"];
MLReference *ref = [mail selection];
id theSelection = [[ref getItem] copy];

// Do something here, which may change the contents of ref,  
// but that's okay since I made a copy in theSelection

MLMoveCommand *cmd = [[theSelection move] to: [[mail mailboxes] byName:@"test"]];

// This command should move the selected messages to the mailbox but fails  
// because theSelection

MLReference *ref2 = nil; // Need to turn theSelection into an MLReference *
MLMoveCommand *cmd = [[ref2 move] to: [[mail mailboxes] byName:@"test"]];

TheSelection を MLReference * に戻す必要があります。これは簡単な操作であると確信していますが、私は appscript が初めてで、いくつかのガイダンスが必要です。ありがとう!

4

2 に答える 2

0

theSelection はいつでも好きな型にキャストできます。メソッドを使用してクエリを実行し、どのタイプであるかを調べることもできますclass。ただし、おそらくこれを行う必要はありません。

例えば、

NSString *something = [(MLReference *)theSelection someFuncIMadeUp];

Apple doc でランタイムに関するすべての情報 (クラス メソッドなど) を読むことができます。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

于 2011-01-22T03:27:52.753 に答える
0

Apple イベント IPC は分散オブジェクトのようなプロキシ オブジェクトを使用すると想定していますが、そうではありません。これは RPC + クエリです。(XML-RPC を介した XPath を大まかな例えとして考えてください。) これはよくある誤解です - Apple 自身はそれを完全に説明できていません - しかし、スクリプト可能なアプリを効果的に制御するには、Apple イベントのクエリベースの性質を理解することが不可欠です。

とにかく、ここであなたが間違っているところです:

id theSelection = [[ref getItem] copy];

この行は、Mail のプロパティを識別する MLReference オブジェクトをコピーしますselectionが、参照は基本的に URL に似ており、事実上ノーオペレーションです。

MLMoveCommand *cmd = [[theSelection move] to: [[mail mailboxes] byName:@"test"]];

この行は、参照された場所で見つかったオブジェクトを移動するようにメールに指示します。このコマンドは、Mail のスクリプト サポートの能力に応じて機能する場合と機能しない場合があります (1 つのコマンドで複数のオブジェクトを操作できるアプリもあれば、コマンドごとに 1 つのオブジェクトに制限されているアプリもあります)。しかし、それが機能したとしても、コマンドが送信された時点で選択されているものに基づいて動作します-これはあなたが求めているものではありません.

この場合の正しい解決策は、getコマンドを使用して参照のリスト (この場合は MLReference インスタンスの NSArray) を取得することです。これを後で反復処理して、参照された各メッセージを順番に移動できます。さいわい、Mail が返す参照は ID によってメッセージを識別します。つまり、その間にメッセージが移動されたとしても、元のメッセージ オブジェクトを指し続ける必要があります。(インデックスによる参照と名前による参照は安定性がはるかに低いため、これらを使用するアプリの操作にはさらに注意する必要があります。)

例(わかりやすくするためにエラーチェックは省略):

MLApplication *mail = [MLApplication applicationWithBundleID: @"com.apple.mail"];
NSArray *messageRefs = [[mail selection] getItem];
// do other stuff here
MLReference *message;
for (message in messageRefs) {
    MLMoveCommand *cmd = [[mail move: message] to: [[mail mailboxes] byName: @"test"]];
    id result = [cmd send];
}

詳細については、appscript のマニュアルを参照してください。また、ASTranslate はあなたの友達です。

于 2011-01-22T17:03:29.720 に答える