问题标签 [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 投票
4 回答
2211 浏览

macos - 如何在可编写脚本的应用程序中将任意 AppleScript 记录传递给 Cocoa?

我有一个 Cocoa 应用程序,它带有一个在 .sdef XML 文件中描述的 AppleScript 字典。sdef 中定义的所有 AppleScript 类、命令等都是工作属性。

除了我的“提交表单”命令。“提交表单”命令是我唯一尝试将参数传递的命令,该参数是从 AppleScript 到 Cocoa 的任意信息哈希表。我认为这应该通过传递一个 AppleScript 来完成record,它将NSDictionary在 Cocoa 端自动转换为一个。

“with values”参数是我遇到问题的record->参数。NSDictionary请注意,不能预先知道/定义记录/字典的键。他们是任意的。

这是我的 sdef XML 中此命令的定义:

我有一个“选项卡”对象,它在 sdef 中响应这个命令:

和可可:

“选项卡”对象正确响应我定义的所有其他 AppleScript 命令。如果我不发送可选的“带值”参数,“选项卡”对象也会响应“提交表单”命令。所以我知道我的基础设置正确。唯一的问题似乎是任意的record->NSDictionary参数。

当我在 中执行上面的 AppleScript 时AppleScript Editor.app,我在 Cocoa 端收到此错误:

而这个在 AppleScript 方面:

谁能告诉我我错过了什么?作为参考,整个应用程序在 GitHub 上是开源的:

http://github.com/itod/fluidium

0 投票
1 回答
593 浏览

objective-c - 使可可应用程序可编写脚本

我是可可开发的新手,谁能告诉我如何使我的可可应用程序可编写脚本。我希望我的应用程序执行某些操作,以响应脚本。我找不到简单的指南或帮助。

0 投票
1 回答
1993 浏览

objective-c - 创建可编写脚本的 Cocoa 应用程序的简单教程(脚本桥)

谁能给我指出一个引入 ScriptingBridge 的非常简单的hello world类型的应用程序?一步一步地创建一个可以从 ruby​​/python/applescript 等实例化的 1 个类 - 1 个方法项目的东西。

我很难弄清楚创建可编写脚本的可可应用程序实际需要什么,并且找不到任何具体的示例或教程。

0 投票
1 回答
329 浏览

objective-c - 将脚本属性添加到从 NSObject 派生的 Cocoa 应用程序?

有人可以指出这个工作的一个例子。我只想通过 AppleScript 设置一个属性值。我已经浏览了所有可编写脚本的示例,它们的设置不同。

头文件:

// Applescript 尝试设置属性“myInt”

最终,调用了 delegateHandlesKey 方法,我能够为属性返回一个值,但永远不会调用 setter。提前致谢...

0 投票
1 回答
365 浏览

objective-c - Issues with making Cocoa app AppleScript-scriptable

I want to make my app scriptable and am running into a few issues I hope some of you may help me with since my experience with making apps scriptable is not great.

The app is not document-based and has a several global named objects of the same class that I want to be accessed from AppleScript. For example, say that I want to have a several catalogues, each named, say "animals", "plants", "cars". I have managed to add several properties to the application class (in AppleScript), each representing one of the catalogues:

I am able to successfully fetch any of those variables, e.g.

gets me really the catalogue variable («class ����» "Animals" of application "MyApp").

Unfortunately, where it gets tricky is when it comes to getting a property from the catalogue - for example 'empty'. Here is the catalogue definition:

The issue here is that when running this AppleScript:

results in an error: MyApp got an error: Can’t make «class ����» "Animals" into type specifier.

Implementation-wise, I have the NSApplication subclassed (and yes, I have specified the main class in Info.plist), which implements several methods, returning those particular catalogues. The XYCatalogue class implements the -objectSpecifier method this way:

The NSApplication subclass implements a -allCatalogues method that returns all the catalogues. I have tried even using the NSUniqueIDSpecifier and the NSPropertySpecifier, all in vain. And yes, the NSApplication subclass does implement both -valueWithName:inPropertyWithKey: and -valueInAllCataloguesWithName: methods and neither is invoked (have breakpoints in both of them).

I have sincerely read Apple's guide several times, however, still can't figure out where is the issue and I'm hanging on this for a few days now. I would be most thankful for any nudge in the right direction. Thanks!

0 投票
1 回答
619 浏览

objective-c - 将记录类型返回到applescript(来自objective-C)

我正在尝试将记录返回给 applescript。当前的解决方案是返回一个 NSDictionary 并在 sdef 文件中定义一个记录类型(Lyx 返回值),但这不起作用 - 我应该构造一个特定的 AppleScript 对象吗?

这是sdef文件

这是目标C代码

当我尝试这个简单的 aplescript

错误信息是:error "Can’t get message of {message:\"\", code:0}." number -1728 from message of {«class mess»:"", «class code»:0}

0 投票
0 回答
190 浏览

macos - 在带有键 Key 的 -objectSpecifier 中返回 NSUniqueIDSpecifier 不会导致 valueInWithUniqueID:得到评估

NSUniqueIdentifier 类的参考文档声称唯一 ID 说明符在以下方案中进行评估:

  1. 如果容器实现了一个方法,其选择器与valueIn<Key>WithUniqueID:脚本键值编码建立的相关模式相匹配,则调用该方法。这种方法可能非常快,并且可能相对容易实现。

  2. 与评估任何脚本对象说明符的情况一样,指定对象的容器有机会评估对象说明符。如果容器类实现了该 indicesOfObjectsByEvaluatingObjectSpecifier:方法,则调用该方法。这种方法可能非常快,但实施起来相对困难。

  3. 指定相关“ID”属性与ID匹配的第一个NSWhoseSpecifier对象的对象被合成和评估。该NSWhoseSpecifier对象必须搜索容器中的所有键控元素,寻找匹配项。搜索可能非常慢。

但是,我没有看到valueIn<Key>WithUniqueID:被调用。举个例子,我有一个类,我用以下方式描述对象说明符:

我在容器类中定义- (id)valueInAllObjectsWithUniqueID:(NSString *)uniqueID的方法就是我定义的方法:

在与容器对应的类中,我还重写-respondsToSelector:以进一步调试它,并观察到脚本系统查询的唯一相关方法是indicesOfObjectsByEvaluatingObjectSpecifier:-objectSpecifier上面调用之后(并确认返回带有容器类描述的非零结果和在评估对象说明符后立即与容器的类接收方法调用一致的容器说明符)。

有任何想法吗?这是在 OSX Mavericks (10.9.4) 上。

0 投票
2 回答
984 浏览

objective-c - 无法在 SWIFT 中解开 NSAppleEventDescriptor

我有一个Applescript,它给了我一个结果。但我无法将值解开为字符串,因此我可以使用它。

NSLog 看起来像这样:

实际结果是一个字符串“test.swift”。我怎样才能解开/解析这个结果?

我试着添加这个:

我也尝试使用该方法descriptorForKeyword(<#keyword: AEKeyword#>),但我不知道设置 AEKeyword 的热度。

0 投票
2 回答
208 浏览

objective-c - Cocoa Scripting:拦截任何对象优先的消息调用

我正在围绕 Cocoa Scripting 编写自己的非 ObjC 框架(想想用 C、C++ 或 Java 编写一个可编写脚本的 Mac 应用程序,或者在我的例子中是 Xojo)。

我希望能够拦截任何对象优先的方法调用,而不必将实际方法添加到 ObjC 类(我不能,因为框架不知道应用程序代码可以提前处理哪些消息 - 所以它'相反,一旦命令消息从脚本引擎进入,则必须接收并传递它们)。

例如,任何属性的 getter 和 setter 都可以通过实现来拦截

以及NSScriptKeyValueCoding协议的所有方法。

我正在寻找一种类似的方法来拦截NSCommandScript发送到这些 sdef 元素中指定的方法的消息:

因此,reloadList:与其通过将其添加到类方法中来实现,我想知道是否有一种通用的方法来捕获所有此类调用。

我发现类方法

被调用要求reloadList:. 但是同样的方法也被用于许多其他目的,所以我宁愿不要盲目地拦截每一个这样的调用,因为如果我将它们全部转发给一个告诉我它是否想要的 Java 函数,它会导致相当严重的性能损失例如,处理它。

我希望有一些东西可以让我在进一步转发之前告诉我这个选择器与 NSScriptCommand 相关。

0 投票
2 回答
309 浏览

macos - 在可编写脚本的 Mac 应用程序中支持“样式化文本”(Cocoa 脚本)

我的应用程序支持使用 Applescript 编写脚本。

我正在尝试使 Applescript 用户可以使用存储在 NSAttributedString 对象中的样式化文本内容。

我以为我可以简单地使用 NSAttributedString 类传递样式文本,就像我使用 NSString 类传递纯文本一样,但这不起作用 - Cocoa Scripting 然后报告它无法转换或强制数据。

我想知道我是否遗漏了什么,或者这对于 Cocoa Scripting 支持的标准类是完全不可能的?

AppleScript 确实知道“样式化文本”类型,如下例所示:

那么,如果 AppleScript 默认知道这种类型,那么 Cocoa 脚本引擎不应该也以某种方式支持它吗?