2010-07-20 35 views
0

有沒有辦法在Scripting Bridge的容器中執行遠程複製?在AppleScript中,這看起來像「將[容器]的[元素]複製到[容器中的位置]」。例如,在告訴TextEdit文檔的上下文中,您可以「將其文本的第一段文本複製到其文本結尾」,以將第一段複製到文檔末尾,同時保留所有格式。如何從腳本橋執行相當於AppleScript「copy」命令?

從Objective-C使用Scripting Bridge有什麼辦法嗎?

我想是這樣的:

SBObject* foo = [container objectAtIndex: 0]; 
[container addObject: foo]; 

,並得到了消息,「不能添加已經存在的對象。」在控制檯上;看起來addObject和各種replace*方法只適用於當您構建一個新的SBObject實例並插入它時。

回答

1

何時的AppleScript的內置copy命令的第二個參數是應用參考,AppleScript的「有益」別名到應用duplicateset或命令,這取決於第一參數是否是另一參考與否。爲避免混淆,最好在處理AppleScript中的腳本化應用程序時明確使用duplicateset

至於SB,您需要在頭文件中尋找duplicate...方法。請注意SB的duplicate命令是半癱瘓的(SB has quite a few shortcomings),因爲它一次只能處理一個對象。大多數應用程序將允許您在單個命令中操作多個對象(警告其腳本支持中的任何錯誤),例如AppleScript會讓你說:

tell application "iTunes" 
    duplicate (every track whose artist is "Foo") to (playlist "Bar") 
end tell 

但SB不會;相反,您必須提取單個引用的列表並對它們進行迭代,逐個處理它們。使代碼變得冗長,如果你在其他地方擁有大量的對象,效率會非常低下。

另一種選擇是objc-appscript,它正確地完成了所有這些工作,並且不太容易出現應用程序兼容性問題(正如Matt Neuburg所說的那樣,「quirk-for-quirk兼容性」)。另外,你ASTranslate,它轉換AppleScript命令,以等效的Python/Ruby的/ ObjC語法 - 非常方便搞清楚時如何撰寫命令正確:

#import "ITGlue/ITGlue.h" 
ITApplication *itunes = [ITApplication applicationWithName: @"iTunes"]; 
ITReference *ref = [[itunes tracks] byTest: [[ITIts artist] equals: @"Foo"]]; 
ITDuplicateCommand *cmd = [[ref duplicate] to: [[itunes playlists] byName: @"Bar"]]; 
id result = [cmd send]; 

另一個選擇,如果你是在10.6,將是使用AppleScriptObjC橋,它允許您在同一個程序中組合使用AS和ObjC,而不需要任何討厭的NSAppleScript廢話。這將允許你使用AppleScript來處理最好的(與其他應用程序通信)和ObjC的其他一切。官方文檔is limited,但網絡搜索應該拋出各種第三方資源。 MacScripter.net可能是一個開始的好地方 - 除了ASOC論壇之外,克雷格·威廉姆斯早些時候發佈了一系列教程。

(順便說一句,克雷格也貢獻了約ASOC到Apress出版的第三版一章學習的AppleScript,我合寫的,並且其中包含大量的信息,應用程序腳本的原則和做法,包括澄清set/duplicate/copy

+0

感謝您的非常徹底的治療!我目前正在使用Scripting Bridge和ASOC的混合體,看起來好像我可以用這種方法。 – 2010-07-21 20:44:57

+0

我找到了' - duplicateTo:(SBObject *)withProperties:(NSDictionary *)'方法,但是如何構建一個'SBObject *'指定「[container]的結尾」或一些類似的不包含實際對象的插頁式位置? – 2010-07-21 20:58:55

+0

你知道,我其實不知道。 SB開發人員完全有可能忘記添加一種方式來做到這一點,但鑑於文檔糟糕且API不透明且不透明,因此很難說沒有進一步的研究。 (SB是我寫objc-appscript的原因,順便說一句。)你有沒有嘗試過將容器本身的引用傳遞給這個機制? (無論如何,有些應用程序期望容器參考。)如果失敗了,我會建議發佈到applescript-implement,並嘗試引起AS工程師的注意。或者使用基本上Just Works的appscript。 – has 2010-07-21 22:30:13