元の 1 対多の投稿に関して、著者は、スクリプトがほぼ機能するようになるまでの手順の概要を説明しています。幸いなことに、問題を解決するために必要な変更はわずかです。
1) サンプル AppleScript
tell application "SpellAnalysis" to get theseObjects
働くことはできません。AS は、Objective-C の変数名 (これらのオブジェクト)を参照できません。sdefは「オブジェクト アイテム」のクラスと要素タイプを定義するため、スクリプトで使用する必要があるのは次のとおりです。
tell application "SpellAnalysis" to get object items -- FIX #1
2) ObjectItem クラスのオブジェクト指定子は、文字列 @"objectName" ではなく、現在のオブジェクトの実際のname プロパティ値を返す必要があります。したがって、次のようになります。
- (NSScriptObjectSpecifier *)objectSpecifier
{
NSScriptObjectSpecifier *containerRef = nil;
NSScriptObjectSpecifier *specifier = [[NSNameSpecifier alloc]
initWithContainerClassDescription:[NSScriptClassDescription classDescriptionForClass:[NSApp class]]
containerSpecifier:containerRef
key:@"theseObjects"
name:self.name]; // FIX #2
return specifier;
}
3)上記をサポートする完全で正しいsdefは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary xmlns:xi="http://www.w3.org/2003/XInclude">
<xi:include href="file:///System/Library/ScriptingDefinitions/CocoaStandard.sdef" xpointer="xpointer(/dictionary/suite)"/>
<suite name="SpellAnalysis Suite" code="sSIA" description="ToDo">
<class name="object item" code="Objs" description="ToDo" plural="object items">
<cocoa class="ObjectItem"/> <!-- KVC: Objective-C class ObjectItem : NSObject -->
<property name="name" code="pnam" type="text" access="r" description="Its name.">
<cocoa key="name"/>
</property>
</class>
<class-extension name="SpellAnalysis application" extends="application" description="ToDo">
<element type="object item" access="r">
<cocoa key="theseObjects"/> <!-- KVC: app delegate's @property NSArray* theseObjects; -->
</element>
</class-extension>
</suite>
</dictionary>
4) 上記をサポートする ObjectItem.h インターフェイス:
@interface ObjectItem : NSObject
@property (nonatomic, strong) NSString *name;
- (instancetype)initWithName:(NSString *)name;
@end
5) 上記をサポートする ObjectItem.m ファイル:
#import "ObjectItem.h"
@implementation ObjectItem
- (instancetype)initWithName:(NSString *)name
{
if (self = [super init])
{
self.name = name;
}
return self;
}
- (NSScriptObjectSpecifier *)objectSpecifier
{
NSScriptObjectSpecifier *containerRef = nil;
NSScriptObjectSpecifier *specifier = [[NSNameSpecifier alloc]
initWithContainerClassDescription:[NSScriptClassDescription classDescriptionForClass:[NSApp class]]
containerSpecifier:containerRef
key:@"theseObjects"
name:self.name]; // FIX #2
return specifier;
}
@end
6) 最後に、上記をサポートする App デリゲート クラスのコード:
#import "MyAppDelegate.h"
#import "ObjectItem.h"
@interface MyAppDelegate ()
@property (nonatomic, strong) NSArray *theseObjects;
@end
@implementation MyAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
self.theseObjects = @[
[[ObjectItem alloc] initWithName:@"Item A"],
[[ObjectItem alloc] initWithName:@"Item B"],
[[ObjectItem alloc] initWithName:@"Item C"]
];
}
- (BOOL)application:(NSApplication *)sender delegateHandlesKey:(NSString *)key
{
if ([key isEqualToString:@"theseObjects"])
{
return YES;
}
return NO;
}
@end
以上で、いくつかの単純なエラーを修正するだけで (スクリプト内に 1 つ、オブジェクト指定子コード内に 1 つ)、次のスクリプトは期待される結果を返します。
tell application "SpellAnalysis"
get object items -- expect a list of object references for all objects in array
end tell
--> {object item "Item A" of application "SpellAnalysis", object item "Item B" of application "SpellAnalysis", object item "Item C" of application "SpellAnalysis"}
他のスクリプトも動作します:
tell application "SpellAnalysis"
get object item 2 -- expect a object reference to the second item in the array
end tell
--> object item "Item B" of application "SpellAnalysis"
tell application "SpellAnalysis"
name of object item 2 -- Expected result: the name property of 2nd obj in array
end tell
--> "Item B"