【问题标题】:AppleScript class name displayed in AppleScript EditorAppleScript 编辑器中显示的 AppleScript 类名
【发布时间】:2014-08-25 12:41:37
【问题描述】:

我编写了一个可以使用 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 在我的 sdef 文件中定义如下:

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

类本身定义为:

@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];

}

【问题讨论】:

    标签: objective-c cocoa applescript


    【解决方案1】:

    您的 sdef sn-p 没有显示您如何定义“当前杂志”术语。正确处理该部分至关重要。它应该看起来像这样:

    <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,其 container 是应用程序对象(不是当前杂志可能所在的内部列表)。例如:

    - (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"
    

    【讨论】:

      【解决方案2】:

      您必须为提供事件术语的苹果事件创建一个 Applescript 词典。有很多关于创建 sdef 文件的资源。

      【讨论】:

      • 当然我已经创建了sdef 文件。你可以在我的问题中看到它的一部分。你在说什么?
      • 丹尼尔,对不起,我不能为我的评论辩护。也许我是通过手机发布的,而您的大部分问题都显示 sdef 低于首屏。 shrug 在我看来它应该是从命令返回的 NSString,所以不知道为什么它是一个 «class »
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2011-04-02
      • 2011-03-15
      相关资源
      最近更新 更多