• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

[Cocoa-Bindings] Ergebgnis mit Cocoa-Bindings in ein Label Schreiben?

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
Hallo,

ich würde gerne über Cocoa-Bindings ein Ergebnis in ein Label (NSTextField/System Font Text) schreiben, die Werte dazu erhalte ich aus zwei Eingabefeldern (NSTextFiled). Das "ziehen der Daten" ist soweit auch kein Problem, nur wie bekomme ich die Daten in das "Label"? Irgendwie stehe ich vor einer Wand :(

Thx,

LoCal
 

Squart

Pomme Etrangle
Registriert
29.01.04
Beiträge
910
Sind das deine Anfänge mit Cocoa-Bindings? Wenn ja, probiere mal folgenden Artikel aus: www.macentwicklerwelt.net/index.php?title=Cocoa_Bindings

Also, du brauchst einen NSObjectController. Erstelle eine Instanz von diesem. Als nächstes brauchst du eine Instanz von deinem Modell. Erstelle eine Verbindung von NSObjectCotroller zu deiner ModelInstanz und wähle das Outlet "Content". Als nächstes musst du noch unter den Attributen des NSObjectController einstellen, wie dein Modell heißt.
Dannach fügst du dem NSObjectController Keys zu. Diese müssen so ausgewählt sein, dass dein Model Getter und Setter für die Keys hat. Beispielsweiße gibst du den Key "blaubaer" ein, dann brauch dein Model auch den Setter - (void)setBlaubaer: und den Getter - (NSString*)blaubaer. (Wichtig ist die Großschreibung bei dem setter).

So, nun gehst du auf das Textfeld 1 -> Bindings -> Value -> Bind to NSObjectController && Model Key Path = blaubaer.
Dies machst du auch mit Textfeld2.
Und mit dem Label.

So, da dein Model intern gut arbeitet wird es selbstständig das Ergebnis, welches du im Label ausgeben willst, erstellen. Die Bindings regeln das nun für dich: Sobald du innerhalb deiner Methode - (void)setBlaubaer:... die Methode - (void)setResult: aufrufst, steckt NSObjectController den neuen Wert in das Label.

So, ich hoffe, dass du damit etwas anfangen kannst, und dass ich deutlich genug formuliert habe. Ich rate dir dennoch den oben genannten Artikel zu lesen, auch im Falle dass dein Problem gelöst ist.
 
  • Like
Reaktionen: MatzeLoCal

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
Olà,

vielen Dank erstmal.
Bis auf einen kleinen Fehler hatte ich das so schon, nur wird das Label nicht aktuallisiert und die set-Methoden nicht zu funktionieren...
Ich prüfe das zur Laufzeit mit NSLog() und bei den gettern funzt das .. nur bei den settern nicht... hmm..

LoCal
 

Squart

Pomme Etrangle
Registriert
29.01.04
Beiträge
910
Funktioniert es vielleicht, wenn du deine Eingabe mit return bestätigst?
 

Squart

Pomme Etrangle
Registriert
29.01.04
Beiträge
910
Sorry, ich habe vergessen, worauf ich hinaus wollte.

Also: Die standard Einstellung der Bindings sagen, dass das Model erst ein Update bekommen soll, sobald die return-Taste betätigt wird.
Aber es gibt noch schönere Wege. Wähle jedes einzelne TextField aus, gehe auf Bindings->Value und aktiviere dort die Checkbox "Continously update values" (oder ähnlich, habe den genauen Wortlaut nicht im Kopf).
Dannach dürfte bei jeder neu eingegebenen Taste das Model geupdated werden und in den anderen Views angezeigt werden.

Gruß
 

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
Olà,

vielen Dank noch mal und sorry, dass ich mich erst so spät melde.

Also der Fehler war wohl folgender:

In dem Label sollte das Ergebnis einer Berechnung stehen, für die die Werte von den zwei Textfeldern benötigt wurden. Ich hatte es erst so gemacht, dass in den settern für die Textfeld-Werte, die Berechnung angestossen wird und die habe ich direkt im setter für das Label gemacht... und das war wohl der fehler.

Also zuerst sah meine setter für das Label quasi so aus:

Code:
-(void) setResult
{
    result = wert1 + wert2; //Die Berechnung war natürlich etwas anders (Hubraumberechnung bzw Kompressionshöhe)
}

Das funzte aber nicht... nun habe ich es so

Code:
-(void)setResult:(float)aResult
{
    result = aResult;
}

-(float)calculateResult
{
    return = wert1 + wert2;
}

und im setter von wert1 und wert2 steht dann noch
Code:
{
    .
    [self setResult:[self calculateResult]];
}

Auf die Weise funktioniert es zumindest etz.

Vielen Dank nochmal,

LoCal