我编写了一个可以使用AppleScript编写脚本的应用程序。现在我可以在AppleScript编辑器中编写下一件事了:
tell application "My Magazines"
current magazine
end tell
它返回以下响应:
«class » "The NY Times" of application "My Magazines"
回复没问题。我可以提取它的属性并使用magazine
类中定义的方法。困扰我的唯一事情是«class »
,这不是人类可读的。我试图找到我需要覆盖的方法,以便为用户提供更好的方法描述,但找不到。
我是否可以使用«class » "The NY Times"
替换Magazine "The NY Times"
以覆盖magazine
的方法?
<class name="magazine" code="sMAG" description="A particular magazine">
<cocoa class="MyMagazine" />
<property name="name" code="pnam" type="text" access="r" description="Title of it">
<cocoa key="name" />
</property>
</class>
在我的sdef文件中定义如下:
@interface MyMagazine : NSObject
{
NSString *name;
}
@property (nonatomic, readonly) NSString *name;
@end
该类本身定义为:
@implementation MyMagazine
@synthesize name;
- (NSScriptObjectSpecifier *)objectSpecifier
{
MyMagazinesList *list = [MyMagazinesList sharedList];
return [[[NSNameSpecifier alloc] initWithContainerClassDescription:(NSScriptClassDescription *)[[list objectSpecifier] keyClassDescription]
containerSpecifier:[list objectSpecifier]
key:@"magazines"
name:name] autorelease];
并实施如下:
{{1}}
}
答案 0 :(得分:0)
您必须为apple事件创建一个Applescript Dictionary,它提供事件的术语。在创建sdef文件时有很多资源。
答案 1 :(得分:0)
您的sdef片段未显示您如何定义“当前杂志”术语。让这一部分正确至关重要。看起来应该是这样的:
<suite name=...>
<class name="magazine" code="sMAG" ...>
<cocoa class="MyMagazine" />
<property name="name" code="pnam" type="text" access="r" ...>
<cocoa key="name" />
</property>
</class>
<class name="application" ...>
<cocoa class="MyApplication"/>
<property name="current magazine" code="cMAG" type="magazine" access="r">
<cocoa key="currentMagazine"/>
</property>
MyApplication.h应该有
@property MyMagazine *currentMagazine;
最后,MyMagazine.m需要一个-objectSpecifier,它将MyMagazine *(当它到达该方法时将 self )转换为该杂志的 NSScriptObjectSpecifier ,其容器是应用程序对象(不是当前杂志可能在的内部列表)。例如:
- (NSScriptObjectSpecifier *)objectSpecifier
{
NSScriptClassDescription *containerClassDesc = (NSScriptClassDescription *)
[NSScriptClassDescription classDescriptionForClass:[NSApp class]];
return [[[NSNameSpecifier alloc]
initWithContainerClassDescription:containerClassDesc
containerSpecifier:nil
key:@"magazine"
name:self.name]];
}
在AppleScript中访问时,您应该看到,例如
tell application "My Magazines" to get current magazine
--> magazine "New York Times" of application "My Magazines"