问题标签 [cocoa-scripting]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
276 浏览

macos - Cocoa Scripting:使用特殊的字符串类型,如原始数据

我的应用程序有一些我希望能够提供给 AppleScript 的原始数据内容,以便至少可以查看它,即使不能通过将其保存到文件或将其设置为支持它的其他对象来处理。

现在,我不明白使用哪种数据类型来实现这一点。

请参阅脚本编辑器的此输出,例如:

我如何返回这些«data ...»,它们显然是实际数据的 4 字符代码和十六进制字符串编码字节的组合。

我尝试从我的脚本属性返回一个包含原始字节数据的 NSData 对象,但这不起作用。

更新

它似乎与实施scripting<type>Descriptorscripting<type>WithDescriptor. 除了在 Sketch 示例代码中使用之外,我找不到任何关于此的文档。如果我碰巧在我的 Sdef 中定义了这样的自定义类型,我假设这些类型将被调用。

但是:我不会提前知道我要发送的类型,所以我无法在 Sdef 中预先定义它们。我的情况更类似于the clipboard:我有想要返回的类似剪贴板的数据,所以我在运行时只知道它们的 4 字符类型。这意味着我不会被这些处理程序询问。必须有其他方法来一般地创建和接收这些类型,就像剪贴板实现一样。

0 投票
3 回答
153 浏览

objective-c - Cocoa Scripting:删除循环中的元素不同步

在为我的 Mac 程序添加脚本功能时,我正在努力解决从索引数组中删除项目的常见编程问题,在该索引数组中,项目索引因删除项目而发生变化。

假设我的应用程序维护一个数据存储,其中存储了“Person”类型的对象。在 sdef 中,我定义了 Cocoa KeyallPersons来访问这些元素。我的应用声明了一个NSArray *allPersons.

到目前为止,它运作良好。例如,这个脚本运行良好:

当我想支持删除项目时,问题就开始了,如下所示:

(我意识到我可以只写“删除每个人”,这很好,但我想展示“重复”如何使事情变得更复杂)。

这不起作用,因为即使在删除其中一些项目之后,AppleScript 仍继续使用原始项目编号来引用这些项目,这自然会改变项目及其编号。

所以,考虑到我们有 3 个人,“Adam”、“Bonny”和“Clyde”,这将发生:

删除第 1 项(亚当)后,其他项目重新编号为第 1 项和第 2 项。第二次迭代删除第 2 项(现在是克莱德),第三次迭代尝试删除第 3 项,该第 3 项不再存在那一点。

我该如何解决这个问题?

我可以强制脚本引擎不使用它们的索引号而是使用它们的唯一 ID 来处理这些项目,这样就不会发生这种情况吗?

0 投票
1 回答
50 浏览

applescript - Cocoa Scripting:“谁的子句”无法访问某些属性

我正在努力使我的应用程序可编写脚本。我与“谁的”过滤子句斗争。

我想让这项工作,但虽然name可以使用,但country不能:

sdef 的相关部分如下所示:

我必须怎么做才能country与“谁的”一起工作?显然,“谁”子句需要一个类型说明符,而不是属性名称,但我无法理解这一点。

我已经实现indicesOfObjectsByEvaluatingObjectSpecifier:了,但这只是被要求name,而不是country

0 投票
1 回答
511 浏览

applescript - Cocoa 脚本:如何使用 AppleScript 处理程序(事件)?

向我的 Mac 应用程序添加脚本功能,我想知道是否可以从我的应用程序调用脚本末端的处理程序。如果是这样,它是如何工作的?

据我了解,处理程序就像函数(如“运行时”),可以由来自脚本自身代码之外的事件调用。Sdef 文件理解event标签,看到我可以使用Sdef Editor输入事件。但是我在 Cocoa Scripting Guide 中找不到任何关于此的文档。

我的应用程序记录了剪贴板,所以我想知道是否可以让正在运行的脚本知道已经记录了一个新的剪贴板,以便脚本可以对其进行操作。

现在,与其调用我为此类事件定位并加载和运行的单独(独立)脚本,我更希望用户可以持续运行一个脚本来声明我的应用程序随后调用的事件。(这里不应该讨论这是否真的是一个好主意,我只是以此作为理解 AppleScript 事件的示例。)

那可能吗?如果不是,sdef 中的事件条目是什么意思?

更新:这是 AppleScript 中处理程序的介绍:MacScripter:处理程序入门

0 投票
2 回答
574 浏览

macos - Cocoa 脚本:返回“null”与“缺失值”

AppleScript 似乎知道特殊值null

如何从基于 Cocoa Scripting 的应用程序中为可编写脚本的属性返回这样的值?

如果我从基于 Cocoa Scripting 的应用程序返回nil( NULL) 或NSNull可编写脚本的属性获取器,脚本编辑器会将其解释为缺失值

如果我返回[NSAppleEventDescriptor nullDescriptor],AppleScript 甚至会显示错误。

0 投票
1 回答
323 浏览

macos - AppleScript:对记录值使用“谁”不起作用

在我的脚本应用程序中,其中一个属性是命名记录类型,并且该记录类型也已在 sdef 中声明(命名为“自定义记录”)。

我可以得到这样的记录:

我也可以像这样成功地测试它:

但我不能在 who 子句中使用它:

我也不能missing value在测试中使用:

这是 AppleScript 的预期行为,即它无法处理 who 子句中的记录吗?

还是我做错了什么?到目前为止,我还没有实现任何强制处理程序或特殊记录处理程序,因为没有任何迹象表明我需要它们。

另外,请参阅我的相关问题:Cocoa Scripting: Returning "null" vs. "missing value"

0 投票
1 回答
101 浏览

applescript - Cocoa 脚本:为“任何”类型返回浮点(双精度)值

在 Sdef 中指定any命令结果的类型时,似乎不能简单地返回 NS 类型,例如NSNumber. 相反,需要返回一个NSAppleEventDescriptor.

但是,NSAppleEventDescriptor它可以处理的值相当有限。似乎不支持浮点数,例如 C 的double类型。

那么,如何为该any类型返回双精度值呢?

0 投票
2 回答
146 浏览

applescript - Cocoa 脚本:集成文本套件

我正在尝试Text Suite在我的可编写脚本的 Mac 应用程序中使用。

我在 Cocoa 脚本指南中找到的小文档建议使用NSTextStorage. 但它没有解释在 Sdef 和编码方面需要如何设置其余部分。

特别是,我想知道如何告诉我的脚本定义何时使用具有更丰富命令的文本套件,何时不使用。我看到的问题是 Text Suite 声明了自己的名为text. 但这已经是用于纯文本的预定义类型。

因此,我最终在 Sdef 编辑器的文本选择器中为我的元素属性选择了两种“文本”,并且对于写入的 Sdef,它是相同的类型。这意味着我无法在 Sdef 中区分处理支持文本套件的文本的属性和不支持文本套件的属性,即使我的代码并不总是NSTextStorage用于它们。

这是否意味着我需要将所有可编写脚本的属性存储在类对象中NSTextStorage?否则,用户可能希望在任何文本属性上使用扩展的文本套件命令,但如果我使用NSString而不是NSTextStorage它们,则会出现运行时错误,对吗?

但是对于只返回简单纯文本字符串的简单属性,例如应用程序的名称,支持 Text Suite 将是矫枉过正,不是吗?

那么,我该怎么办呢?我是否应该简单地让用户弄清楚他什么时候可以使用 Text Suite,以及因为我NSTextStorage只使用我认为值得富文本支持的属性而不能使用?其他人如何解决这个问题?

更新

事实证明,当我只是将文本套件添加到我的 Sdef 时(我使用 Sdef 编辑器在其文件子菜单下作为“NSTextSuite”提供的那个),所有返回的属性都text停止工作(导致错误 -10000)。我已经将 Text Suite 条目与其他应用程序中的条目进行了比较,并且看不到任何明显的差异。

为什么添加文本套件会破坏所有具有“文本”类型属性的属性?

以下是缩写的 Sdef,因此您可以看到我在做什么:

运行此脚本将导致错误 -10000:

如果我从 Sdef 中删除“文本套件”,则代码运行不会出错。

0 投票
1 回答
127 浏览

applescript - Cocoa Scripting:在其容器中获取可编写脚本对象的索引

给定一个可编写脚本的对象NSScriptObjectSpecifier,我如何知道其容器中对象的索引?

NSScriptObjectSpecifier我在或其子类中找不到任何访问器方法。

如果对象是 a NSIndexSpecifier,则很容易获得索引。但如果它是其他东西,例如 a NSNameSpecifier,则需要对其进行查询。Cocoa 脚本指南说框架在需要学习索引时自动执行此操作,但没有说明如何完成。

可编写脚本的对象可以实现返回此类索引的方法indicesOfObjectsByEvaluatingObjectSpecifier,但这是一个可选方法,因此我假设我不能简单地在任何可编写脚本的对象上调用它。

是否有其他简单的方法来学习索引,或者我是否必须实现自己的方法来遍历说明符并自行处理所有可能的情况?

0 投票
2 回答
129 浏览

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

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

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

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

我试图通过子类化命令、收集克隆的对象说明符然后返回它们来在我的脚本化应用程序中解决这个问题。

如果只有一个项目被复制,这很有效。

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

但是,如果在没有to参数的情况下对多个项目使用重复命令,则项目将以非连续方式排序到数组中。例如,如果最初有 2 个 "x" 元素,id 为 1 和 2,duplicate every x将在每个元素的原始元素之后插入每个元素的副本,因此我们将按以下顺序拥有它们:1、3、2、4。

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

的子类中没有“列表”说明符,而且我似乎NSScriptObjectSpecifier也不能为每个人返回一个 NSArray 。NSScriptObjectSpecifier虽然NSAppleEventDescriptor支持创建列表,但我无法弄清楚如何将对象说明符转换为 NSAppleEventDescriptors。

除了强制克隆对象的连续顺序之外,我该如何解决这个问题(恐怕这需要我完全重新实现NSCloneCommand's 操作)。

顺便说一句,Script Debugger 的作者Mark Aldritt确认了( duplicatealso: move, open) 没有按预期返回值的问题。