从AppleScript

时间:2016-07-02 00:26:30

标签: xcode macos cocoa applescript kvc

我有一个用Xcode编写的非常基本的Cocoa应用程序,我试图用一个简单的AppleScript脚本访问我的应用程序委托的属性:

tell application "HelloWorld"
    set appDelegateProperty to property1
end tell

Cocoa Scripting Guide中的信息似乎很简单。虽然看起来我编写的代码符合键值编码(KVC),但我看到错误表明不是这样。

我已将名为NSString的{​​{1}}类型的合成属性添加到我的property1类,并在AppDelegate方法中将其设置为@"test" 。我在我的脚本定义(SDEF)文件中添加了条目,以允许从AppleScript访问该属性。

以下是相关代码(您可以在this web page下载Xcode项目的压缩副本或浏览源代码):

的Info.plist

我添加了这些键以在应用程序中启用AppleScript支持:

applicationDidFinishLaunching()

AppDelegate.h

<key>NSAppleScriptEnabled</key>
<string>YES</string>
<key>OSAScriptingDefinition</key>
<string>HelloWorld.sdef</string>

AppDelegate.m

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>
@property   NSString*   property1;
@end

HelloWorld.sdef

#import "AppDelegate.h"

@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
@end

@implementation AppDelegate
@synthesize property1;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    property1 = @"test";
}
@end

当我在Xcode调试器中启动应用程序并在脚本编辑器中执行此AppleScript代码时,这是我在脚本编辑器控制台中看到的错误:

脚本编辑器控制台输出

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
 <dictionary title="HelloWorld">
    <suite name="HelloWorld" code="HELO" description="HelloWorld scripting suite">
        <class name="application" id="HELO" code="capp" description="top-level scripting object">
            <cocoa class="NSApplication"/>
            <property name="property1" code="Hadp" description="property1" type="text" access="r">
                <cocoa key="property1"/>
            </property>
        </class>
    </suite>
 </dictionary>

Xcode调试器控制台输出

 error "HelloWorld got an error: AppleEvent handler failed." number -10000

故障排除说明

不知何故,我的代码实际上并不符合KVC,但我不确定如何或为什么。

我怀疑可能存在一个问题,即该属性位于应用程序委托而不是 2016-07-01 15:29:18.449 HelloWorld[90280:3166995] Command: Intrinsics.get Direct Parameter: <NSPropertySpecifier: property1> Receivers: <NSPropertySpecifier: property1> Arguments: { } 2016-07-01 15:29:18.449 HelloWorld[90280:3166995] An exception was thrown during execution of an NSScriptCommand... 2016-07-01 15:29:18.449 HelloWorld[90280:3166995] [<NSApplication 0x620000101560> valueForUndefinedKey:]: this class is not key value coding-compliant for the key property1. 2016-07-01 15:29:18.449 HelloWorld[90280:3166995] Result: (null) 2016-07-01 15:29:18.449 HelloWorld[90280:3166995] Error: -10000 "(null)" 类本身,但我可能错了。

我已经设置了绑定调试日志级别,如&#34;疑难解答Cocoa绑定&#34; Cocoa Bindings Programming Topics文档的一部分,用于解决绑定问题:

NSApplication

我还将脚本调试日志级别设置为1,如&#34;打开脚本调试输出&#34; “可可脚本指南”部分可以查看更详细的调试输出,如下所示:

defaults write net.none.HelloWorld NSBindingDebugLogLevel 1

最后,我已按照&#34;检查应用程序中的可写入性信息&#34;中的说明进行操作。 Cocoa脚本指南的一部分,用于输出Cocoa从SDEF获取的脚本信息的描述。这是调试器控制台命令及其输出:

defaults write net.none.HelloWorld NSScriptingDebugLogLevel 1

po [NSClassFromString(@"NSScriptSuiteRegistry") sharedScriptSuiteRegistry]

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果密钥位于AppDelegate,则必须执行

- (BOOL)application:(NSApplication *)sender delegateHandlesKey:(NSString *)key
{
    return [key isEqualToString:@"property1"]; 
}

对于多个密钥,声明包含所有密钥的NSSet属性keySet并返回

return [keySet containsObject:key]; 

您不需要在sdef文件中指定cocoa key property1,因为名称与选择器匹配。