【问题标题】:Issues with making Cocoa app AppleScript-scriptable使 Cocoa 应用程序可编写 AppleScript 脚本的问题
【发布时间】:2013-06-17 12:25:50
【问题描述】:

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

该应用程序不是基于文档的,并且具有多个我想从 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 的指南好几遍,但是仍然无法弄清楚问题出在哪里,我已经坚持了几天了。我将非常感谢朝正确方向的任何推动。谢谢!

【问题讨论】:

  • 只是一些信息:Xcode 中包含一个名为“SimpleScripting”的示例代码项目-
  • @DigiMonk:我已经浏览了所有SimpleScripting* 示例项目——SimpleScripting 只向应用程序添加了一个 BOOL 属性,它工作正常,因为它不引用其他对象。还有其他示例项目,包括 Sketch 项目,但是,所有内容都是基于文档的。我现在将我的代码基于 SimpleScriptingObjects,但是它在应用程序上使用 element 类型来获取对象,不幸的是,这对我来说不是一个选项,因为我需要能够轻松地直接指定每个目录而不列出所有目录。 ..
  • 一般来说,获取带有“«class»”的对象说明符(没有标识符,没有四字节代码)意味着您的 -objectSpecifier 方法中有问题。具体来说,这只是一个猜测,您是否创建了自己的 NSApplication 子类?如果是这样,请尝试将[NSApp class] 更改为[NSApplication class]。这并不完全正确,但可能会更好。
  • Chris N:这是一个关于 NSApplication 子类的有趣注释——它可能是问题所在。在返回 objectSpecifier 时,我已经非常关注示例应用程序,我想这确实是 NSApp 与 NSApplication 的问题......愚蠢的我......

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


【解决方案1】:

您没有看到正确的类名,例如动物目录,而是看到了«class» 代码,这很好地表明了您的-objectSpecifier 函数返回了错误的说明符。

-objectSpecifier 需要遵循一条重要规则:

传递给-initWithContainerClassDescription: 的密钥必须与在&lt;cocoa key&gt; 下为该类的属性定义输入的密钥相同。但是,在您的示例中,它们不匹配:属性访问器称为 animalsCatalogue,但您在 -objectSpecifier 中使用的键是 allCatalogues。他们需要匹配。

此外,正如 Apple 文档所说,containerSpecifier 可能仅是 nil 如果目标是应用程序,而不是任何其他可编写脚本的对象。如果您为非应用程序对象传递 nil,Cocoa 脚本引擎可能不会将此作为错误报告回来,但结果将类似于传递错误的键。

【讨论】:

    猜你喜欢
    • 2016-09-08
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    相关资源
    最近更新 更多