2011-01-22 33 views
0

我正在寫一個應用程序,使用Objective-C-appscript(objc-appscript)與Mail進行對話。我想複製當前選擇的郵件並稍後對其執行一些處理 - 此時當前的選擇可能已經改變。將id轉回到AppScript中的引用對象objective-c

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"]]; 

我需要把選項變回MLReference *。我相信這應該是一個簡單的操作,但我對appscript並不熟悉,需要一些指導。謝謝!

+0

我不確定它需要成爲MLReference。相反,我認爲它需要是一個AppScript列表對象。你如何將一個NSArray對象變成一個AppScript列表對象? – Adam 2011-01-22 07:45:27

回答

0

您始終可以將選擇投射到您想要的任何類型。您還可以查詢它,並使用class方法找出它認爲它是什麼類型。你可能不需要這樣做。

例如,

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

您可以閱讀所有關於在蘋果文檔的運行時的東西(如類方法):

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

+0

我知道選擇是一個NSCFArray,但我想把它變成一個MLReference。查看MLReference頭文件,有一個名爲referenceWithAppData的類方法:id)appData aemReference:(id)aemReference,但我不確定需要放置哪些參數。 – Adam 2011-01-22 06:45:00

0

你假設蘋果事件IPC使用分佈式對象之類的代理對象,但情況並非如此:它是RPC +查詢。 (認爲​​XPath是一種粗略的比喻)。這是一種常見的誤解 - 蘋果公司自己完全無法解釋它 - 但掌握Apple事件的基於查詢的性質對於有效控制可編寫腳本的應用程序至關重要。

總之,這裏的你要去哪裏錯了:

id theSelection = [[ref getItem] copy]; 

此行拷貝的MLReference對象識別郵件的selection屬性,但作爲參考基本上類似於有效的無操作的URL。

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

該行告訴Mail移動它在引用位置找到的對象。該命令可能會或可能不會工作,具體取決於郵件腳本支持的能力(某些應用程序可能能夠使用單個命令操縱多個對象;其他應用程序僅限於每個命令的單個對象)。但即使它確實起作用,它也會根據命令發送時所選擇的內容進行操作 - 這不是你所追求的。

在這種情況下,正確的解決方案是使用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是你的朋友。

+0

感謝您的回覆。我在純AppleScript中使用了這種方法,但是將消息發送到每個消息與將消息發送到整個消息列表的速度要慢得多。在我的其他實現中,我使用NSAppleScript編譯腳本,執行「將選擇複製到選擇」並移動操作。我認爲這比使用AppScript更黑客。 – Adam 2011-01-22 17:10:24

相關問題