0

有没有办法从 Scripting Bridge 在容器内进行远程复制?在 AppleScript 中,这看起来像“将 [容器] 的 [元素] 复制到 [容器中的位置]”。例如,在文本编辑文档的上下文中,您可以“将其文本的第一段复制到其文本的末尾”以将第一段复制到文档的末尾,同时保留所有格式。

使用脚本桥从 Objective-C 有什么办法吗?

我试过这样的事情:

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

并收到一条消息“无法添加已存在的对象”。在控制台上;看来,addObject各种replace*方法仅在您构建新SBObject实例并插入它时才有效。

4

1 回答 1

1

当 AppleScript 内置copy命令的第二个参数是应用程序引用时,AppleScript 会“帮助”应用程序duplicateset命令的别名,具体取决于第一个参数是否是另一个引用。为避免混淆,在 AppleScript 中处理可编写脚本的应用程序时,最好使用duplicateor明确。set

至于 SB,您需要duplicate...在头文件中查找方法。请注意,SB 的duplicate命令是半瘫痪的(SB 有很多缺点),因为它一次只能处理一个对象。大多数应用程序将允许您在单个命令中操作多个对象(警告其脚本支持中的任何错误),例如 AppleScript 会让您说:

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

但 SB 不会;相反,您必须提取单个引用列表并对其进行迭代,一次处理一个。使您的代码相当冗长,并且如果您在其他地方有大量对象,则效率可能非常低。

另一种选择是objc-appscript,它可以正确地完成所有这些工作,并且通常不太容易出现应用程序兼容性问题(正如 Matt Neuburg 所说的,'quirk-for-quirk compatibility')。另外,您还获得了 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 用于其他所有事情。官方文档是有限的,但是网络搜索应该会抛出各种第三方资源。MacScripter.net 可能是一个不错的起点——除了 ASOC 论坛之外,Craig Williams 不久前还发布了一系列教程。

(顺便说一句,Craig 还为 Apress 的 Learn AppleScript 第三版贡献了一个关于 ASOC 的章节,这是我与人合写的,其中包含有关应用程序脚本编写原则和实践的大量信息,包括对set/ duplicate/的澄清copy。)

于 2010-07-21T17:33:37.363 回答