繁体   English   中英

在Cocoa应用程序中定义和执行简单的AppleScript命令

[英]Defining and executing simple AppleScript commands in a Cocoa app

我正在尝试为我编写的Cocoa应用程序添加一些脚本功能。 我为我的项目创建了一个sdef (脚本定义文件)。 到目前为止,我已经成功地使用AppleScript访问对象子元素(元素),但我不能在生活中找出如何调用方法(命令)。

这是我的sdef文件。

<suite name="mySuite" code="mSUI" description="My Application Suite">
    <class name="application" code="capp" description="Top level scripting object.">
        <cocoa class="NSApplication"/>
        <!-- I can access these elements fine -->
        <element description="Test children." type="child" access="r">
            <cocoa key="myChildren"/>
        </element>
        <!-- Cannot seem to call this method :( -->
        <responds-to command="testmethod">
            <cocoa method="exposedMethod:"/>
        </responds-to>
    </class>
    <class name="child" code="cHIL" description="A Child." plural="children">
        <cocoa class="Child"/>
        <property name="name" code="pnam" description="The child name." type="text" access="r">
            <cocoa key="name"/>
        </property>
    </class>
    <command name="testmethod" code="tEST" description="Execute the test method" />
</suite>

这是我的控制器类实现(这是我的应用程序的委托)

MyController.h

#import <Cocoa/Cocoa.h>

@interface MyController : NSObject {
    NSMutableArray* myChildren;
}
// Some Methods

@end

+ myController的Scripting.m

#import "MyController+Scripting.h"

@implementation MyController (Scripting)

// This works when I'm accessing the myChildren 
- (BOOL)application:(NSApplication*)sender delegateHandlesKey:(NSString*)key { 
    NSLog(@"Key = %@", key);
  return ([key isEqualToString:@"myChildren"]);
}
// This does NOT work...
- (void)exposedMethod:(NSScriptCommand*)command {
    NSLog(@"Invoked Test Script Method %@", [command description]);
}

@end

最后,我正在尝试的AppleScript是:

tell application "MyApplication"
    testmethod
end tell

响应"AppleScript Error - The variable testmethod is not defined."

我在这里做错了什么想法? 我觉得我错过了一些简单的东西,但我的谷歌搜索似乎没有出现任何有用的东西。

我刚刚发布了一个关于如何在这里添加带参数命令的详细解决方案: https//stackoverflow.com/a/10773994/388412

简而言之:我认为你应该继承NSScriptCommand并覆盖- (void)performDefaultImplementation,而不是在控制器中公开一个方法。 至少这是我从文档中提取的内容:

“此命令是NSScriptCommand的子类,包含一个方法,performDefaultImplementation。该方法覆盖NSScriptCommand中的版本”

...它对我来说很好,请查看我的链接答案以获取详细信息。

事情看起来大多正确,但<command/>的代码应该是一个由两部分组成的代码(八个字符),而不是四个。

(我实际上从未在Cocoa应用程序中添加脚本功能,所以在黑暗中用一粒盐刺我的刺。)

我猜的第一件事就是exposedMethod:接受一个参数,但是我没有看到你的sdef或AppleScript中指定的位置。 实际上,看起来AppleScript将testmethod视为变量,而不是命令。 (也许它应该类似于“ testmethod with ... ”而不是?)您可能需要在sdef中为命令定义<parameter><direct-parameter>元素。

另外,你不需要一个对象来调用该方法吗? 由于您的控制器是应用程序委托,我不确定那里的复杂性,但AppleScript可能会尝试在NSApplication而不是您的委托上调用testMethod:

我猜你已经看过Apple的示例代码和其他资源,但如果没有,这里有一些可能有用的链接:

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM