我想让我的应用程序可编写脚本并遇到一些问题,我希望你们中的一些人可以帮助我,因为我的应用程序可编写脚本的经验不是很好。
该应用程序不基于文档,并且有几个我希望从AppleScript访问的同一类的全局命名对象。例如,假设我想要有几个目录,每个目录都命名为“动物”,“植物”,“汽车”。我已经设法为应用程序类添加了几个属性(在AppleScript中),每个属性代表一个目录:
<class name="application" description="My application." code="capp" inherits="application">
<cocoa class="NSApplication"/>
<property name="animals catalogue" code="acat" description="…" type="catalogue" access="r">
<cocoa key="animalsCatalogue"/>
</property>
<property name="cars catalogue" code="ccat" description="…" type="catalogue" access="r">
<cocoa key="carsCatalogue"/>
</property>
<property name="plants catalogue" code="pcat" description="…" type="catalogue" access="r">
<cocoa key="plantsCatalogue"/>
</property>
</class>
我能够成功获取任何这些变量,例如
tell application "MyApp"
set c to get animals catalogue
end tell
让我真正的目录变量(«class ����» "Animals" of application "MyApp"
)。
不幸的是,当它从目录中获取属性时会变得棘手 - 例如'空'。这是目录定义:
<class name="catalogue" code="ctlg" description="...">
<cocoa class="XYCatalogue"/>
<property name="empty" code="empt" description="Is the catalogue empty?" type="boolean" access="r">
<cocoa key="isEmpty"/>
</property>
</class>
这里的问题是在运行AppleScript时:
tell application "MyApp"
set c to get animals catalogue
get empty of c
end tell
导致错误:MyApp got an error: Can’t make «class ����» "Animals" into type specifier.
实现方面,我有NSApplication子类(是的,我已经在Info.plist中指定了主类),它实现了几个方法,返回那些特定的目录。 XYCatalogue
类以这种方式实现-objectSpecifier
方法:
return [[[NSNameSpecifier alloc] initWithContainerClassDescription:
[NSScriptClassDescription classDescriptionForClass:[NSApp class]]
containerSpecifier:nil
key:@"allCatalogues"
name:[self name]] autorelease];
NSApplication子类实现了一个返回所有目录的-allCatalogues
方法。我甚至试过使用NSUniqueIDSpecifier
和NSPropertySpecifier
,都是徒劳的。是的,NSApplication子类确实实现了-valueWithName:inPropertyWithKey:
和-valueInAllCataloguesWithName:
方法,并且都没有被调用(在两个方法中都有断点)。
我曾多次真诚地阅读Apple的指南,然而,仍然无法弄清问题在哪里,我现在已经挂了好几天了。我会非常感谢任何朝着正确方向的推动。谢谢!
答案 0 :(得分:2)
您没有看到正确的类名称,例如动物目录,而是看到«class»
代码,这是您的-objectSpecifier
功能的良好指标返回错误的说明符。
有一条重要规则需要遵循-objectSpecifier
:
传递给-initWithContainerClassDescription:
的密钥需要与<cocoa key>
下该类的属性定义输入的密钥相同。但是,在您的示例中,它们不匹配:属性访问器名为 animalsCatalogue ,但您在-objectSpecifier
中使用的密钥是 allCatalogues 。他们需要匹配。
此外,正如Apple文档所述,如果目标是应用程序,则containerSpecifier
可能只是nil
,而对于任何其他可编写脚本的对象,busboy
可能只是 var busboy = new Busboy({ headers: req.headers, limit: { files: 1, fileSize: 50000 } });
。如果为非应用程序对象传递nil,Cocoa脚本引擎可能不会将此报告为错误,但结果将类似于传递错误的键。