AppleScript类名称显示在AppleScript编辑器中

时间:2014-06-14 23:10:16

标签: objective-c cocoa applescript

我编写了一个可以使用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}}

}

2 个答案:

答案 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"