我有一个用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]
有什么想法吗?
答案 0 :(得分:0)
如果密钥位于AppDelegate
,则必须执行
- (BOOL)application:(NSApplication *)sender delegateHandlesKey:(NSString *)key
{
return [key isEqualToString:@"property1"];
}
对于多个密钥,声明包含所有密钥的NSSet
属性keySet
并返回
return [keySet containsObject:key];
您不需要在sdef文件中指定cocoa key
property1
,因为名称与选择器匹配。