Moin! Ich hab mal wieder eine Cocoa-Anfängerfrage:
Wie kann ich eine Controller-Methode, die normalerweise von einem Button aufgerufen wird, händisch aufrufen?
Wir schreiben in der HAW gerade einen RPN-Taschenrechner in Java, der auch einfache Script-Dateien speichen und laden/ausführen können soll. Die Script-Dateien enthalten pro Zeile entweder eine Double-Zahl, oder einen Code für eine Operation, z.B. "enter", "x^2" usw.
Hier hatten wir es so gemacht, daß der Actionlistener eines Buttons eine Methode von mehreren unseres Controllers aufruft und einen Integer-Wert mit dem Code (als Konstanten. 0-9 = Ziffer, DOT = Punkt usw.) der Funkion übergibt. Innerhalb der Methoden wird dann per switch-case genauer unterschieden. Beim Auswerten einer Script-Datei können wir direkt die Controller-Methoden aufrufen, da sie ja nur eine Integer-Konstante erwarten (jetzt würde ich es mit Enums machen).
Ich hab nun angefangen, diesen Taschenrechner in Cocoa nachzuschreiben (mein erstes Coco-Programm). Ich wollte das im Prinzip genauso abfeiern, wie in der Java-Version:
Ich hab mehrere Tastengruppen auf der GUI (Ziffernblock, Funktionen usw.) als Matrix. Jede dieser Button-Gruppen ruft bei Aktivierung eine Methode des Controllers auf (z.B. enterDigit, wenn der Ziffernblock aktiviert wurde). In den jeweiligen Methoden werte ich per switch-case den selectedTag vom sender aus.
Das klappt auch alles wunderbar. Nur hab ich jetzt das Problem: Ich parse die Datei (per stringWithContentsOfFile gelesen) und schaue mir jede Zeile an (mit NSScanner). Mit parseDouble schaue ich, ob in der Zeile eine Zahl ist. Wenn ja, wird die Zeile (der String) Ziffer für Ziffer an den Controller (enterDigit) geschickt. Wenn es nicht klappt, schaue ich, welcher Befehl im String steht und rufe die entsprechende Controller-Methode (z.B. enterFunction) auf. (Ich schicke die Zahlen deshalb Ziffer für Ziffer, wie eine Eingabe über die Tastatur, da ich die schon funktionierende Logik nutzen wollte und mir das in diesem Fall vertretbar erscheint.)
Nun endlich zum Problem: Wie rufe ich händisch die Controller-Methoden auf? Die Methoden erwarten ja ein (id)sender, den ich nach dem selectedTag abfragen kann. Mit der Doku liege ich noch ein bisschen auf Kriegsfuß, aber so langsam (wirklich nur langsam) steigt die Übersicht und man bekommt ein Gefühl für das Benennungsschema (was sich ja z.T. deutlich von dem von HJava unterscheidet).
Oder hätte man das Problem hier vielleicht anders angehen sollen?
Ich hoffe, es ist zu verstehen, was ich meine. Ich könnte auch Code posten, falls es mehr helfen sollte.
Wie kann ich eine Controller-Methode, die normalerweise von einem Button aufgerufen wird, händisch aufrufen?
Wir schreiben in der HAW gerade einen RPN-Taschenrechner in Java, der auch einfache Script-Dateien speichen und laden/ausführen können soll. Die Script-Dateien enthalten pro Zeile entweder eine Double-Zahl, oder einen Code für eine Operation, z.B. "enter", "x^2" usw.
Hier hatten wir es so gemacht, daß der Actionlistener eines Buttons eine Methode von mehreren unseres Controllers aufruft und einen Integer-Wert mit dem Code (als Konstanten. 0-9 = Ziffer, DOT = Punkt usw.) der Funkion übergibt. Innerhalb der Methoden wird dann per switch-case genauer unterschieden. Beim Auswerten einer Script-Datei können wir direkt die Controller-Methoden aufrufen, da sie ja nur eine Integer-Konstante erwarten (jetzt würde ich es mit Enums machen).
Ich hab nun angefangen, diesen Taschenrechner in Cocoa nachzuschreiben (mein erstes Coco-Programm). Ich wollte das im Prinzip genauso abfeiern, wie in der Java-Version:
Ich hab mehrere Tastengruppen auf der GUI (Ziffernblock, Funktionen usw.) als Matrix. Jede dieser Button-Gruppen ruft bei Aktivierung eine Methode des Controllers auf (z.B. enterDigit, wenn der Ziffernblock aktiviert wurde). In den jeweiligen Methoden werte ich per switch-case den selectedTag vom sender aus.
Das klappt auch alles wunderbar. Nur hab ich jetzt das Problem: Ich parse die Datei (per stringWithContentsOfFile gelesen) und schaue mir jede Zeile an (mit NSScanner). Mit parseDouble schaue ich, ob in der Zeile eine Zahl ist. Wenn ja, wird die Zeile (der String) Ziffer für Ziffer an den Controller (enterDigit) geschickt. Wenn es nicht klappt, schaue ich, welcher Befehl im String steht und rufe die entsprechende Controller-Methode (z.B. enterFunction) auf. (Ich schicke die Zahlen deshalb Ziffer für Ziffer, wie eine Eingabe über die Tastatur, da ich die schon funktionierende Logik nutzen wollte und mir das in diesem Fall vertretbar erscheint.)
Nun endlich zum Problem: Wie rufe ich händisch die Controller-Methoden auf? Die Methoden erwarten ja ein (id)sender, den ich nach dem selectedTag abfragen kann. Mit der Doku liege ich noch ein bisschen auf Kriegsfuß, aber so langsam (wirklich nur langsam) steigt die Übersicht und man bekommt ein Gefühl für das Benennungsschema (was sich ja z.T. deutlich von dem von HJava unterscheidet).
Oder hätte man das Problem hier vielleicht anders angehen sollen?
Ich hoffe, es ist zu verstehen, was ich meine. Ich könnte auch Code posten, falls es mehr helfen sollte.
