0

ここに私が持っているものがあります:

1) 「Info.plist」に適切な「権限」エントリを含めます。

  • 「スクリプト可能」: はい
  • 「スクリプト定義ファイル名」: myApp.sdef

2) クラス拡張「要素」タグ内に要素「要素」タグを含めます。

`<class-extension extends="application" description="The application and top-level scripting object.">
    <!-- various property tags go here -->

<element type="object item" access="r">
<cocoa key="theseObjects"/>
</element>
</class-extension>`

3) 要素クラス タグを含めます。

<class name="object item" code="Objs" description="Application 'too many' object collection" plural="object items" inherits="item"> // I don't believe 'inherits' name is critical for AS to work
<cocoa class="ObjectItem"/>                     
</class>

4) デリゲートに「NSApplication」スクリプト機能サポートを転送するデリゲート メソッドを含めます。

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

}

5) 「ObjectItem」クラスを作成し、そこにオブジェクト指定子を配置します。

 - (NSScriptObjectSpecifier *)objectSpecifier { 
NSScriptObjectSpecifier *containerRef = nil;
NSScriptObjectSpecifier *specifier = [[NSNameSpecifier alloc] initWithContainerClassDescription:[NSScriptClassDescription classDescriptionForClass:[NSApp class]] containerSpecifier:containerRef key:@"theseObjects" name:@"objectName"];
return [specifier autorelease];

6) アプリケーションのデリゲート内に KVO アクセサー メソッドをポストします。

 - (NSArray *)theseObjects;
   {
ObjectItem *thisObject = [[ObjectItem new] autorelease];
NSArray *thisArray = [NSArray arrayWithObject:thisObject];
return thisArray;
    }
}

7) 要素の getter メソッドからオブジェクトを返す AppleScript を作成します。

    tell application "SpellAnalysis"
    get theseObjects
    end tell

8) 結果: エラー「変数オブジェクトが定義されていません。」「オブジェクト」からの番号 -2753

9) 髪を抜く

4

2 に答える 2

4

元の 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"
于 2014-08-23T16:30:20.227 に答える