制作Cocoa app AppleScript脚本的问题

时间:2013-06-17 12:25:50

标签: objective-c macos cocoa applescript cocoa-scripting

我想让我的应用程序可编写脚本并遇到一些问题,我希望你们中的一些人可以帮助我,因为我的应用程序可编写脚本的经验不是很好。

该应用程序基于文档,并且有几个我希望从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方法。我甚至试过使用NSUniqueIDSpecifierNSPropertySpecifier,都是徒劳的。是的,NSApplication子类确实实现了-valueWithName:inPropertyWithKey:-valueInAllCataloguesWithName:方法,并且都没有被调用(在两个方法中都有断点)。

我曾多次真诚地阅读Apple的指南,然而,仍然无法弄清问题在哪里,我现在已经挂了好几天了。我会非常感谢任何朝着正确方向的推动。谢谢!

1 个答案:

答案 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脚本引擎可能不会将此报告为错误,但结果将类似于传递错误的键。