2009-07-23 57 views
6

我正在尝试向我编写的Cocoa应用程序添加一些脚本功能。我为我的项目创建了一个sdef(脚本定义文件)。到目前为止,我已经成功地使用AppleScript访问对象子元素(元素),但是我不能在我的生活中弄清楚如何调用方法(命令)。在Cocoa应用程序中定义和执行简单的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

也许我错过了一些东西,但这是一个可可(OS X)的应用程序或可可触摸(iPhone)的应用程序? iPhone应用程序不支持AppleScript。 – sbooth 2009-07-24 01:34:08

+0

提问者澄清说,UIController是自定义应用程序控制器/委托类的(选择不当)名称,所以我更新了代码以消除混淆。 – 2009-07-29 16:21:35

回答

1

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

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

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

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

祝你好运!

2

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

2

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

总之:我觉得你应该继承NSScriptCommand并覆盖- (无效)performDefaultImplementation而不是暴露您的控制器中的一种方法。至少这是我从docs蒸馏:“这个命令是NSScriptCommand的一个子类,包含一个方法,performDefaultImplementation这方法重写版本NSScriptCommand”

...它工作正常对我来说,请参阅我的链接答案的细节。

相关问题