Instanz einer eigenen Klasse kann nicht per AppleScript ausgelesen werden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Instanz einer eigenen Klasse kann nicht per AppleScript ausgelesen werden

    Hi!
    Ich versuche gerade, eine App AppleScript fähig zu machen.
    Meine sdef Datei hängt im Anhang, aber hier die entscheidenden Teile:

    Quellcode

    1. ​ <class name="application" code="capp" description="The application&apos;s top-level scripting object.">
    2. <cocoa class="NSApplication"/>
    3. ...
    4. <property name="ApplikationsString" code="dist" type="text">
    5. <cocoa key="applicationText"/>
    6. </property>
    7. <property name="MeineInstanz" code="test" type="MeineKlasse">
    8. <cocoa key="testInstanz"/>
    9. </property>
    10. ...
    11. </class>
    Alles anzeigen

    Quellcode

    1. ​ <suite name="MySuite" code="mysu">
    2. <class name="MeineKlasse" code="meik">
    3. <cocoa class="meineKlasse"/>
    4. <property name="MeinText" code="meih" type="text">
    5. <cocoa key="meinText"/>
    6. </property>
    7. </class>
    8. </suite>


    Hier der Beispielcode:

    Quellcode

    1. @interface AppDelegate : NSObject <NSApplicationDelegate>
    2. @property (assign) NSString *applicationText;
    3. @end
    4. @interface meineKlasse : NSObject
    5. @property (assign) NSString *meinText;
    6. @end
    7. @implementation meineKlasse
    8. -(id)init {
    9. self = [super init];
    10. _meinText = @"Hallo Welt";
    11. return self;
    12. }
    13. @end
    14. @implementation AppDelegate
    15. - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    16. {
    17. _applicationText = @"Hallo Applikation";
    18. meineKlasse *testInstanz = [[meineKlasse alloc] init];
    19. NSLog(@"%@ - %@",_applicationText, testInstanz.meinText);
    20. }
    21. - (BOOL)application:(NSApplication *)sender delegateHandlesKey:(NSString *)key {
    22. return YES;
    23. }
    24. @end
    Alles anzeigen


    Wenn ich nun per AppleScript

    Quellcode

    1. ​tell application "Sample01"
    2. get ApplikationsString
    3. end tell

    ausführe, wird korrekt der Wert der Variable applicationText ausgelesen:
    "Hallo Applikation"

    Wenn ich nun per AppleScript meine Instanzvariable auslesen will

    Quellcode

    1. ​tell application "Sample01"
    2. get MeineInstanz
    3. end tell

    bekomme ich in AppleScript ein
    ​error "Sample01 got an error: AppleEvent handler failed." number -10000

    und in der Konsole ein
    ​2014-07-14 14:34:37.249 Sample01[8038:303] An exception was thrown during execution of an NSScriptCommand...
    2014-07-14 14:34:37.249 Sample01[8038:303] [<AppDelegate 0x60800000bca0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key testInstanz.


    Allerdings ist mir unklar warum, denn die Instanzvariable zur Klasse meineKlasse ist doch genau so verfügbar, wie die Variable applicationText

    Vielleicht habt ihr ja eine Idee.

    Danke und Gruß
    Dateien
    • scripting.txt

      (16,93 kB, 351 mal heruntergeladen, zuletzt: )
  • Das stimmt allerdings.
    Allerdings hab ich nun völlig den Faden verloren.

    Quellcode

    1. ​@interface meineKlasse : NSObject
    2. @property (assign) NSString *meinText;
    3. @end
    4. @interface AppDelegate : NSObject <NSApplicationDelegate>
    5. @property (assign) NSString *applicationText;
    6. @property (retain) meineKlasse *testInstanz;
    7. @end
    8. @implementation meineKlasse
    9. -(id)init {
    10. self = [super init];
    11. _meinText = @"Hallo Welt";
    12. return self;
    13. }
    14. @end
    15. @implementation AppDelegate
    16. - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    17. {
    18. _applicationText = @"Hallo Applikation";
    19. _testInstanz = [[meineKlasse alloc] init];
    20. NSLog(@"%@ - %@",_applicationText, _testInstanz.meinText);
    21. }
    22. - (BOOL)application:(NSApplication *)sender delegateHandlesKey:(NSString *)key {
    23. return YES;
    24. }
    25. @end
    Alles anzeigen


    ​2014-07-14 14:51:56.834 Sample01[8113:303] Error while returning the result of a script command: the result object...
    <meineKlasse: 0x600000201e90>
    ...could not be converted to an Apple event descriptor of type 'MeineKlasse'. This instance of the class 'meineKlasse' returned nil when sent -objectSpecifier (is it not overridden?) and there is no coercible type declared for the scripting class 'MeineKlasse'.
  • Klaro (nebenbei hat man beim lesen das Gefühl, dass Apple alles nur erdenkliche dafür tut, jemanden von der Idee anzuhalten), nur bekomme ich das Beispiel mit meiner eigenen Klasse nicht hin.
    Properties der Applikation und elements aus nem Array klappt ohne Probleme.
    Daher bin ich so verwirrt, dass genau das Konzept bei der eigenen Klasse wieder nicht funktionieren soll. Und wie gesagt sehe ich nicht, wo der o.g. Code falsch sein soll.
  • DanielBocksteger95 schrieb:

    Zwar habe ich nur überlfogen worum es geht, aber objc.io hat da vor kurzer zeit erst selber ein #Issue für auf gemacht. objc.io/issue-14

    Cool danke!

    macmoonshine schrieb:

    Naja, die Fehlermeldung sagt ja ziemlich genau, was sie will. Du arbeitest in AppleScript ja nicht direkt mit Objekten, sondern mit Referenzen (z. B. meineInstanz of application "Sample01").

    Das ist mir schon klar. Auch die Dokumentation kenne ich bereits wie schon erwähnt
    Wissen teilen ist nicht so Dein Ding, was? ;)
  • bananenBrot schrieb:


    Das ist mir schon klar. Auch die Dokumentation kenne ich bereits wie schon erwähnt
    Wissen teilen ist nicht so Dein Ding, was? ;)


    Wieso, macmoonshine hat Dich doch richtig verwiesen? Inkl. Link + Hinweis auf den Fehler.

    Aber damit Du nicht allzuviel Doku lesen musst 8) , hier noch ein paar Informationen:

    * In den jeweiligen Containerklassen solltest Du eine Methode "valueInXXXWithUniqueID:" implementieren (Ersetze "XXX" durch den Plural deines Keys)

    * Deine Objekte müssen die Methode objectSpecifier implementieren. Diese gibt ein Objekt vom Typ NSScriptObjectSpecifier zurück.

    Na ja, man muss zugeben, es gibt schönere Sachen als eine AppleScript-Anbindung zu implementieren. Vor allem die Fehlersuche nervt, wenn ein Script nicht funktioniert.

    schönen Gruß

    gandhi
  • bananenBrot schrieb:

    Wissen teilen ist nicht so Dein Ding, was?

    Wie meinst Du das?

    Noch mal deutlicher: AppleScript arbeitet intern mit Referenzen, sogenannten Object-Specifiern. Wenn Du auf Objekte Deiner mit AppleScript zugreifen willst, die keine Unterklassen der AppleScript-Standardklassen sind, musst Du die Object-Specifier selber bauen.

    Die Fehlermeldung weist Dich darauf hin, dass Dein Objekt keinen Object-Specifier liefert.

    bananenBrot schrieb:

    Auch die Dokumentation kenne ich bereits wie schon erwähnt

    Das bezweifele ich.
    „Meine Komplikation hatte eine Komplikation.“
  • bananenBrot schrieb:

    Herrje, jetzt verstehe ich warum mir meine Kollegen die ganze Zeit von dem Forum hier abraten

    Daniel hat Dir einen Link zu einem recht guten Artikel gegeben, und ghandi Tipps zur Implementierung von Object-Specifiern. Ich habe Dir die Ursache Deines Fehlers beschrieben und Dir einen genauen Hinweis gegeben, wo Du in der Doku etwas dazu findest.

    Was sollen wir Deiner Meinung nach noch tun?
    „Meine Komplikation hatte eine Komplikation.“
  • bananenBrot schrieb:

    Herrje, jetzt verstehe ich warum mir meine Kollegen die ganze Zeit von dem Forum hier abraten :D
    Nunja, danke bis hierher
    Am besten wird es sein, wenn du woanders hin ziehst und deine Kollegen dann auch fort bleiben.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • bananenBrot schrieb:

    Wissen teilen ist nicht so Dein Ding, was?

    Vollkommen ins Schwarze getroffen: Macmoonshine ist mit Abstand der am wenigsten hilfsbereite Typ im Forum, der würde nie sein Wissen teilen. Deshalb ist er vermutlich auch der einzige hier, dem noch nie jemand ein Like gegeben hat. Wahrscheinlich weiß der auch gar nichts, sonst würde er ja vielleicht Bücher schreiben, die als Openbook frei verfügbar sind, oder Vorträge auf irgendwelchen Konferenzen halten. Neenee, das ist ein Scharlatan, da hast du ja nochmal Glück gehabt, dass du das so schnell erkannt hast... ;)
    Multigrad - 360°-Produktfotografie für den Mac
  • macmoonshine schrieb:

    mattik schrieb:

    Neenee, das ist ein Scharlatan, da hast du ja nochmal Glück gehabt, dass du das so schnell erkannt hast... ;)

    Mist, enttarnt. Wo sind die gefälschten Papiere? Rio, ich komme! :D
    Die Weltmeisterschaft ist jetzt vorbei. Wir haben übrigens gewonnen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    macmoonshine schrieb:

    mattik schrieb:

    Neenee, das ist ein Scharlatan, da hast du ja nochmal Glück gehabt, dass du das so schnell erkannt hast... ;)

    Mist, enttarnt. Wo sind die gefälschten Papiere? Rio, ich komme! :D
    Die Weltmeisterschaft ist jetzt vorbei. Wir haben übrigens gewonnen.

    Herzlichen Glückwunsch! Ich wurde gar nicht eingeladen mitzuspielen…
    Oder beziehst Du das 'wir' wieder auf den glorreichen Ersten FC, der sich frecherweise erdreistet hat, Poldis '10' weiterzugeben?
    Oder (noch schlimmer) beziehst Du das 'wir' gar auf die gesamte Nation und schmückst Dich dadurch mit Federn, die Dir überhaupt nicht zustehen?
    (Immer dieses Zugehörigkeitsgefühl beim Zuschauen sportlicher Aktivitäten – ich werd's nie verstehen.)

    back to topic
    Ich raff's nicht. Da schießt irgendein beratungsresistenter Intelligenzallergiker quer, verteilt ein paar Roundhousekicks (oder 'Rundumschläge', sofern die altdeutsche Variante bevorzugt wird) und wir haben nichts besseres zu tun, als diesem undankbaren Querulanten ins Gewissen zu reden?
    Einer weniger, der uns mit der Lösung trivialer Probleme und der Beantwortung fauler Fragen kostbare Zeit raubt.
    Haters gonna hate.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P