这是关于使用Cocoa Scripting实现可编写脚本的应用程序的问题。
我的应用程序的可编写脚本的application
对象包含自定义类的元素,我们称之为flower
。
在.sdef文件中,flower
的Cocoa类被指定为ScriptableFlower
。
在Applescript中,现在可以写:
tell app "myapp"
get flowers
end tell
我的代码提供了一个用于检索鲜花的访问器功能:-(NSArray*)flowers
。
现在,我想实现一种添加新花的方法,以便人们可以写:
tell app "myapp"
make new flower
end tell
使用NSCreateCommand
使用“make”的默认Core套件处理程序的默认行为如下:
脚本引擎将通过调用我的flowers
函数获取当前的鲜花数组,然后实例化类ScriptableFlower
的新Cocoa对象,然后使用包含的数组调用setFlowers:(NSArray*)
我的原始对象加上新创建的对象。
然而,这对我的应用程序来说并不好:我不能允许脚本引擎随意创建我的脚本化类的对象。
相反,我需要成为实例化它们的人。
中途解决方案是实现默认的-(id)init
方法,然后检测它是否被我调用 - 如果没有,我可以采取额外的步骤。但那不干净。我宁愿不让脚本引擎创建新对象,而是自己提供它们,因为我可能已经准备好了“某个地方”的对象。
Cocoa Scripting中是否有一些条款导致它在我想要创建新的可编写脚本的对象时调用它?
更新
澄清一下:Cocoa Scripting docs解释说可以实现特殊的插入处理程序(insertObject:in<Key>AtIndex:
),这样就不必占用整个NSArray,但这仍然会导致脚本引擎创建物体。不过,我需要被要求创建对象。
答案 0 :(得分:1)
文件NSObjectScripting.h
为此提供了一个功能:
- (id)newScriptingObjectOfClass:(Class)objectClass forValueForKey:(NSString *)key withContentsValue:(id)contentsValue properties:(NSDictionary *)properties;
自OS X 10.5起可用,并记录如下:
创建要插入到由键标识的关系中的可编写脚本的类的新实例,设置contentsValue和它的属性,然后返回它。或者因失败而返回零。 contentsValue和属性派生自Make命令的“with contents”和“with properties”参数。 contentsValue可能是零。当Cocoa调用此方法时,使用脚本键值编码的-coerceValue:forKey:方法尚未强制使用contentsValue和属性。在.sdef声明的脚本性中,传入对象的类型可靠地匹配相关的.sdef声明。
答案 1 :(得分:0)
一个选项是子类return View()
并实现自己的逻辑。