Cocoa 脚本:从“重复”命令返回克隆对象

2023-12-10

AppleScriptduplicate命令应该返回复制的对象。

虽然使用基于 AE 的原始函数的应用程序似乎可以做到这一点,但基于 Cocoa 脚本框架的应用程序似乎永远不会返回任何内容,但缺失值.

看来命令处理程序NSCloneCommand负责不返回克隆对象的说明符。

我试图通过对命令进行子类化、收集克隆的对象说明符然后返回它们来在可编写脚本的应用程序中修复此问题。

如果仅重复一项,则此方法效果很好。

如果克隆多个项目并使用to命令的参数(如duplicate every widget to end): 然后我可以返回类型的说明符NSRangeSpecifier指定这些克隆项目中的第一个和最后一个。

但是,如果对多个项目使用重复命令without the to范围,然后项目被排序到数组中非连续方式。例如,如果最初有 2 个“x”元素,id 分别为 1 和 2,duplicate every x将在每个元素的原始元素之后插入每个元素的副本,以便我们按以下顺序排列它们:1、3、2、4。

Now, 如何为此返回一个说明符,即第 3 项和第 4 项的说明符?

的子类中没有“列表”说明符NSScriptObjectSpecifier,并且我无法为每个人返回一个 NSArrayNSScriptObjectSpecifier看起来要么是。而同时NSAppleEventDescriptor支持列表的创建,我不知道如何将对象说明符转换为 NSAppleEventDescriptors。

除了强制克隆对象的连续顺序(这需要我重新实现NSCloneCommand恐怕完全是操作)。

BTW, 马克·奥尔德里特,《脚本调试器》的作者,确认了问题 that duplicate (also: move, open)不返回应有的值。


马克·奥尔德里特进一步帮助了我,告诉我一些私有 API 方法:

@interface NSScriptObjectSpecifier (NSPrivate)
+ (id) _scriptingSpecifierWithDescriptor:(NSAppleEventDescriptor*) descriptor;
+ (id) _objectSpecifierFromDescriptor:(NSAppleEventDescriptor*) descriptor inCommandConstructionContext:(id) context;
- (NSAppleEventDescriptor*) _asDescriptor;
@end

The _asDescriptor就是我一直在寻找的 - 一种将对象说明符变成NSAppleEventDescriptor这样我就可以将其添加到列表对象中。其代码如下所示:

- (NSAppleEventDescriptor*) objectSpecifiersAsList:(NSArray*) objectSpecifiers {
    NSAppleEventDescriptor* result = [NSAppleEventDescriptor listDescriptor];
    for (NSScriptObjectSpecifier* specifier in objectSpecifiersArray) {
        [result insertDescriptor:specifier._asDescriptor atIndex:0];
    }
    return  result;
}

然而,当我尝试返回不连续的项目时,我发现这不起作用。其实和返回一个效果是一样的NSArray一样的NSScriptObjectSpecifiers。这是一个例子:

set x to duplicate widgets 1 thru 2

当自定义重复命令处理程序返回复制的项目 3 和 4 的说明符列表时,AppleScript 最终会再次调用相同的命令处理程序,然后给出错误 -10006 并显示以下消息:

Can't set widgets 1 thru 2 to widgets 1 thru 2

请注意 - 它没有说“widgets 3 thru 4”或“{widget 3, widget 4}”。不,它始终将第一个参数给出的项目报告给重复命令。

一旦我将代码更改为返回单个说明符或范围说明符,该命令就会再次正常运行。

所以这似乎是 Cocoa Scripting(或 AppleScript?)中的一个隐藏错误,其中它无法处理列表中返回的对象说明符。

更新及解决方案

经过多次尝试和错误,我找到了一种有效的方法:

结果的类型必须从“描述符”更改,有两种可能性:

  • 使用上面返回的代码listDescriptor,结果类型需要是“any”,即:

    <result>
        <type type="any"/>
    </result>
    
  • 或者,如果结果类型更改为“任意列表”,则可以返回一个包含以下内容的 NSArrayNSAppleEventDescriptor values:

    <result>
        <type type="any" list="yes"/>
    </result>
    

两种解决方案都需要使用私有_asDescriptor然而,因为没有其他已知的方法可以将可编写脚本的对象转换为NSAppleEventDescriptor.

(当然,如果你的应用程序支持duplicate命令仅适用于一种类型的元素,那么您可以将类型更改为“list of yourtype”并仅返回对象的 NSArray,而不需要私有方法 - 仅在返回 type 的结果时才需要any.)

马克对于使用私有方法是这样说的:

如果您担心 Mac 应用商店问题,这些私有方法是 Apple 给我的,因为没有替代 API。我很确定您可以获得使用它们的许可。

我希望尽快将实现此解决方案的我自己的应用程序提交到 App Store。然后我将用使用私有函数的结果更新这个答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cocoa 脚本:从“重复”命令返回克隆对象 的相关文章

随机推荐

  • Grails Log4j DSL 配置中的 Log4j 过滤器

    有没有办法指定 log4j 过滤器Grails log4j DSL配置 我需要在 Grails log4j 配置中定义类似的内容
  • 如何防止 gdb 在下一个命令后停止

    我正在尝试定义一个命令链 该命令链将在 gdb 中的断点之后调用 break some function commands up next printf some string continue end 在这种情况下 例如 我想在 some
  • 将复选框添加到 PHP POST 电子邮件表单

    我正在尝试为 WordPress 构建一个表单 我过去使用过插件 但我需要对某些特定样式进行最大程度的控制 我还不太擅长 PHP 所以正在努力尝试向脚本添加复选框 我已经删除了我的尝试并将复选框留在了 html 中 但不在 PHP 中 有人
  • SQL命令插入中文字母

    我有一个数据库 其中有一列 nvarchar 类型 如果我写 INSERT INTO table VALUES 玄真 表明 在表中 我应该怎么办 我正在使用 SQL 开发人员 使用单引号而不是双引号来创建文本文字并用于NVARCHAR2 N
  • 在 for 循环中写入 .csv

    我想在 for 循环中写入 csv 文件 假设我有一个数据框data为了简单起见 有 3 行变量x 最后 我希望输出为 200 个 csv 文件 每个文件包含一行数据 数据的第一列是我的变量的标识 ID 此外 我的数据描述如下 data I
  • JavaScript通过数组中的循环设置时间差

    我尝试使用 JavaScript 中的循环将值存储在数组中 它只对我部分有效 我想将时间存储在数组中 会有startTime endTime和一个间隔 例如 如果想获取9 00到10 00之间的时间 间隔为15分钟 应该打印 09 00 0
  • Java:为什么大正数相乘会导致负结果? [复制]

    这个问题在这里已经有答案了 我看到一些用 Java 进行整数相乘的奇怪行为 我正在做一些编码练习 并发现了以下嘶嘶声类型的练习 要求 给定一个整数 编写一个函数 找出小于给定整数的每个 3 的倍数的乘积 except5 的任意倍数 例如 给
  • async/await whenall 立即返回

    我有这个 简单 测试代码 不要打扰类方法的奇怪使用 我正在努力抓住Task lt gt 错综复杂 我想我有点了解Task lt gt Start Task lt gt Result模式 也许因为它更像 旧 Thread Start 但是一旦
  • 在 python 中动态生成变量名称[重复]

    这个问题在这里已经有答案了 有没有办法可以在 python 中循环生成变量名并为其赋值 例如 如果我有 prices 5 12 45 I want price1 5 price2 12 price3 45 我可以在循环或其他方式中执行此操作
  • 如何在没有窗口的情况下将图像直接传输到屏幕?

    如何显示 PNG BITMAP JPEG 文件等中的图像 在没有窗口的屏幕上 我希望图像出现时周围没有框架 最好不要将其作为窗口注册在任务栏上 我想将这些图像快速连续地显示在屏幕上 如果它与 Windows XP 和 Windows 7 兼
  • jQuery 属性名称包含

    我正在尝试定位包含某个单词的属性名称 而不是以您所想的方式 可以说我有 div div 我如何定位具有 data foo 在属性名称中 我认为您不能像定位属性值一样定位属性名称 但是 您可以使用 filter 有效地做到这一点 div fi
  • 选择一系列嵌套元素的每隔一个元素(每个元素只有一个子元素)[重复]

    这个问题在这里已经有答案了 是否存在每秒定位一次的 css 选择器 letter 当然 我可以把所有 letter位于同一级别并使用的元素 nth child 2n 但它们都取决于前一个字母的位置 所以我需要嵌套 firstname pos
  • 填充前一列中的空白单元格 pandas python

    如果我有一个简单的数据框 例如 q 1 q 1 mark q 2 q 2 mark TRUE a 1 c FALSE b 2 TRUE c 3 如何填写 q 2 mark 列的空白值 以便它们与 q 1 mark 匹配 所以步骤是 查看该列
  • UWP 的“Add-DevAppPackage”Powershell 脚本检查开发人员许可证。这是侧面加载的问题吗?

    我正在开发一个 LOB 业务线 UWP 项目 我们希望将该应用程序作为 appxbundle文件 旁边是 cer和一个 Powershell 脚本 这是当您通过选择从 Visual Studio 生成捆绑包时在包中生成的内容Project
  • VS Code 终端打开,然后崩溃并在按终止按钮后消失

    在 VS Code 中单击 终止终端 后出现此错误 无法解析您的 shell 环境 生成的 shell 出现意外的退出代码 代码为 null 信号 SIGSEGV 现在 当我单击 终端 新终端 时 我的 VSCode 会执行此操作 它打开窗
  • CUDA 流销毁和 CudaDeviceReset

    我已经使用 CUDA 流实现了以下类 class CudaStreams private int nStreams cudaStream t streams cudaStream t active stream public default
  • 获取范围相对于其父容器的开始和结束偏移量

    假设我有这个 HTML 元素 div Hello everyone a This is my home page a p Bye p div 用户用鼠标选择 home 我希望能够确定有多少个字符 parent他的选择开始 以及从末尾开始有多
  • 重命名 JSON 中的属性

    你好 这是我的 json name test options Repartition Active Satellite No 我想用 s 重命名 卫星 中的 卫星 但我没有成功 我试过 UPDATE Liaison set content
  • 如何在将 html 写入 PDF 时应用样式

    我正在将 html 添加到 pdf 文件中 我的 html 是 div 形式 并且包含 style 属性 其样式如下border 2px solid red 但这种风格不适用于我正在写入 pdf 文件的 html 我正在使用以下代码 Doc
  • Cocoa 脚本:从“重复”命令返回克隆对象

    AppleScriptduplicate命令应该返回复制的对象 虽然使用基于 AE 的原始函数的应用程序似乎可以做到这一点 但基于 Cocoa 脚本框架的应用程序似乎永远不会返回任何内容 但缺失值 看来命令处理程序NSCloneComman