我正在尝试将一些脚本功能添加到我编写的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."
任何想法我在这里做错了什么?我觉得我错过了一些简单的东西,但我的谷歌搜索似乎没有任何有用的东西。
答案 0 :(得分:2)
事情看起来大多正确,但<command/>
的代码应该是由两部分组成的代码(8个字符),而不是4个。
答案 1 :(得分:2)
我刚刚发布了一个详细的解决方案,介绍如何在此处添加带参数的命令:https://stackoverflow.com/a/10773994/388412
简而言之:我认为您应该继承 NSScriptCommand 并覆盖 - (void)performDefaultImplementation ,而不是在控制器中公开方法。至少这是我从docs提取的东西:
“此命令是NSScriptCommand的子类,包含一个方法performDefaultImplementation。该方法覆盖NSScriptCommand中的版本”
...它对我来说很好,请查看我的链接答案以获取详细信息。
答案 2 :(得分:1)
(我实际上从未在Cocoa应用程序中添加脚本性,所以在黑暗中用一粒盐刺我的刺。)
我猜的第一件事是exposedMethod:
接受一个参数,但是我没有看到你的sdef或AppleScript中指定的位置。实际上,看起来AppleScript将testmethod
视为变量,而不是命令。 (也许它应该类似于“testmethod with ...
”?)您可能需要在sdef中为命令定义<parameter>
或<direct-parameter>
元素。
另外,你不需要一个对象来调用该方法吗?由于您的控制器是应用程序委托,我不确定那里的复杂性,但AppleScript是否可以尝试在NSApplication而不是您的委托上调用testMethod:
?
我猜你看过Apple的示例代码和其他资源,但如果没有,这里有一些链接可能会有所帮助:
祝你好运!