2016-03-26 4 views
2

Dies ist eine Frage zum Implementieren einer skriptfähigen Anwendung mit Cocoa Scripting.Eigene Objekte für "make new" in meiner scriptfähigen Anwendung bereitstellen

Das scriptfähige application-Objekt meiner App enthält Elemente einer benutzerdefinierten Klasse, lassen Sie es flower nennen. In der .sdef-Datei wird die Cocoa-Klasse für flower als ScriptableFlower angegeben.

In Applescript, kann man jetzt schreiben:

tell app "myapp" 
    get flowers 
end tell 

Mein Code sieht für die Beschaffung von Blumen eine Accessorfunktion: -(NSArray*)flowers.

Nun Ich mag eine Art und Weise zu implementieren, neue Blumen hinzuzufügen, so dass man schreiben kann:

tell app "myapp" 
    make new flower 
end tell 

Das Standardverhalten für diese, mit den Standard-Core-Suite-Handler für „make“ mit NSCreateCommand ist wie folgt:

die Scripting-Engine durch den Aufruf meiner flowers Funktion, die aktuelle Anordnung von Blumen, die holen dann eine neue Cocoa Objekt der Klasse ScriptableFlower, instanziiert und dann setFlowers:(NSArray*) mit einem Array aufrufen, die meine ursprünglichen Objekte plus der neu erstellte enthält .

Dies ist jedoch nicht gut für meine Anwendung: Ich kann nicht zulassen, dass die Skript-Engine Objekte meiner skriptfähigen Klassen nach Belieben erstellen kann.

Stattdessen muss ich derjenige sein, der sie instanziiert.

Eine halbwegs Lösung wäre die Standardmethode -(id)init implementieren und dann erkennen, ob es von mir aufgerufen wird - wenn nicht, kann ich die zusätzlichen Schritte ausführen. Aber das ist nicht sauber. Ich lasse lieber nicht zu, dass die Skript-Engine neue Objekte erstellt, sondern sie selbst bereitstellt, da ich das Objekt "irgendwo" bereits vorbereitet habe.

Gibt es eine Bestimmung in Cocoa Scripting, die dazu führt, dass sie mich immer dann aufruft, wenn ich ein neues skriptfähiges Objekt erstellen soll?

aktualisieren

Zur Klarstellung: Die Cocoa Scripting docs erklärt, dass ein speziellen Einführungshandler implementieren kann (insertObject:in<Key>AtIndex:), so dass man nicht über die gesamte NSArray nehmen, aber das führt nach wie vor zu der Scripting-Engine zu erstellen das Objekt. Ich muss jedoch gebeten werden, stattdessen das Objekt zu erstellen.

Antwort

1

Die Datei NSObjectScripting.h bietet eine Funktion dafür:

- (id)newScriptingObjectOfClass:(Class)objectClass forValueForKey:(NSString *)key withContentsValue:(id)contentsValue properties:(NSDictionary *)properties; 

Es seit OS X verfügbar ist 10.5 und wie folgt dokumentiert:

eine neue Instanz eines skript Klasse erstellen in die eingefügt werden Beziehung, die durch den Schlüssel identifiziert wird, den contentsValue und dessen Eigenschaften festlegen und zurückgeben. Oder gebe nil für einen Fehler zurück. Der contentsValue und die Eigenschaften werden von den Parametern "with contents" und "with properties" eines Make-Befehls abgeleitet. Der contentsValue kann gleich Null sein.Wenn diese Methode von Cocoa aufgerufen wird, sind weder der contentsValue noch die Eigenschaften mithilfe der Skriptschlüsselwertcodierung -coerceValue: forKey: method noch erzwungen worden. In der .sdef-deklarierten Skriptfähigkeit stimmen die Typen der übergebenen Objekte jedoch zuverlässig mit den relevanten .sdef-Deklarationen überein.

0

Eine Option ist die Unterklasse NSCreateCommand und implementieren Sie Ihre eigene Logik.