2010-07-20 36 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