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.