objective-c - 使 Cocoa 应用程序可编写 AppleScript 脚本的问题

标签 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

让我真正获得目录变量(应用程序“MyApp”的“class ����”“Animals”)。

不幸的是,当涉及到从目录中获取属性时,例如“空”,就会变得棘手。这是目录定义:

<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 出现错误:无法将 «class ����»“Animals”转换为类型说明符。

在实现方面,我对 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: 方法,但都没有被调用(它们都有断点)。

我已经真诚地阅读了苹果的指南好几次,但是,仍然无法弄清楚问题出在哪里,并且我已经坚持了几天了。我将非常感谢任何朝着正确方向的插入。谢谢!

最佳答案

事实上,您没有看到正确的类名称,例如动物目录,而是看到 «class»代码是一个很好的指标,表明您的 -objectSpecifier函数返回错误的说明符。

有一条重要的规则需要遵守 -objectSpecifier :

key 传递给-initWithContainerClassDescription:需要与 <cocoa key> 下为该类的属性定义输入的相同。 。然而,在您的示例中,它们并不匹配:属性访问器称为 animalsCatalogue,但您在 -objectSpecifier 中使用的 key 是所有目录。他们需要匹配。

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

关于objective-c - 使 Cocoa 应用程序可编写 AppleScript 脚本的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17147455/

相关文章:

objective-c - NSUserDefault 在 NSMenuItem 绑定(bind)中注册的默认初始显示

objective-c - ios模拟器: simulate swipe and drag

objective-c - 删除 NSTableCellView

swift - 在 Swift 中实现拖放区域

ios - 发件人有时会发送错误的值

ios - 如何以编程方式更改设备方向,屏幕的旋转方向应为顺时针方向

macos - OSX 如何让 ls -l 按字母顺序排序并将目录和文件一起列出

django - GeoDjango 找不到 geos 库

macos - 我的Safari特定安装拒绝打开我的网站

c++ - 如何在 Cocoa 应用程序中关闭键盘声音?