1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

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

Dieses Thema im Forum "OS X-Developer" wurde erstellt von MatzeLoCal, 12.09.05.

  1. MatzeLoCal

    MatzeLoCal Rheinischer Bohnapfel

    Dabei seit:
    05.01.04
    Beiträge:
    2.421
    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
     
  2. Squart

    Squart Pomme Etrangle

    Dabei seit:
    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.
     
    MatzeLoCal gefällt das.
  3. MatzeLoCal

    MatzeLoCal Rheinischer Bohnapfel

    Dabei seit:
    05.01.04
    Beiträge:
    2.421
    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
     
  4. Squart

    Squart Pomme Etrangle

    Dabei seit:
    29.01.04
    Beiträge:
    910
    Funktioniert es vielleicht, wenn du deine Eingabe mit return bestätigst?
     
  5. Squart

    Squart Pomme Etrangle

    Dabei seit:
    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ß
     
  6. MatzeLoCal

    MatzeLoCal Rheinischer Bohnapfel

    Dabei seit:
    05.01.04
    Beiträge:
    2.421
    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
     

Diese Seite empfehlen