【发布时间】: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 方法。我什至尝试过使用NSUniqueIDSpecifier 和NSPropertySpecifier,但都是徒劳的。是的,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