2

这是一个关于使用 Cocoa Scripting 实现可编写脚本的应用程序的问题。

我的应用程序的可编写脚本application对象包含自定义类的元素,我们称之为flower

在 .sdef 文件中,Cocoa 类flower被指定为ScriptableFlower.

在 Applescript 中,现在可以编写:

tell app "myapp"
  get flowers
end tell

我的代码提供了一个用于检索花的访问器函数:-(NSArray*)flowers.

现在,我喜欢实现一种添加新花的方法,这样就可以编写:

tell app "myapp"
  make new flower
end tell

默认行为,使用“make”的默认核心套件处理程序 using NSCreateCommand,如下所示:

脚本引擎将通过调用我的函数来获取当前的花数组flowers,然后实例化一个新的 Cocoa 类对象ScriptableFlower,然后setFlowers:(NSArray*)使用包含我的原始对象和新创建的对象的数组进行调用。

但是,这对我的应用程序不利:我不能允许脚本引擎随意创建可编写脚本的类的对象。

相反,我需要成为实例化它们的人。

一个中途的解决方案是实现默认-(id)init方法,然后检测它是否被我调用 - 如果没有,我可以采取额外的步骤。但这并不干净。我宁愿根本不让脚本引擎创建新对象,而是自己提供它们,因为我可能已经准备好“某处”的对象。

Cocoa Scripting 中是否有一些规定会导致它在需要我创建新的可编写脚本的对象时调用我?

更新

澄清一下:Cocoa Scripting 文档解释说可以实现特殊的插入处理程序(insertObject:in<Key>AtIndex:),这样就不必占用整个 NSArray,但这仍然会导致脚本引擎创建对象。不过,我需要被要求创建对象。

4

2 回答 2

1

该文件NSObjectScripting.h为此提供了一个功能:

- (id)newScriptingObjectOfClass:(Class)objectClass forValueForKey:(NSString *)key withContentsValue:(id)contentsValue properties:(NSDictionary *)properties;

它从 OS X 10.5 开始可用,并记录如下:

创建一个新的可编写脚本类的实例以插入到由键标识的关系中,设置它的 contentsValue 和属性,然后返回它。或者返回 nil 失败。contentsValue 和 properties 派生自 Make 命令的“with contents”和“with properties”参数。contentsValue 可能为零。当 Cocoa 调用此方法时,contentsValue 和属性都不会使用脚本键值编码的 -coerceValue:forKey: 方法强制执行。然而,在 .sdef 声明的脚本性中,传入对象的类型可靠地匹配相关的 .sdef 声明。

于 2016-03-27T13:47:06.453 回答
0

一种选择是子类化NSCreateCommand并实现您自己的逻辑。

于 2016-03-28T13:35:58.553 回答