Bindings per Code

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

  • Bindings per Code

    Hi.
    Ich habe folgendes gegeben: Ein Textfeld, dass einen Wert von einem Slider per Bindigs bekommt.
    Dazu habe ich beim Textfeld "Bind to:" auf meinen Controller gesetzt und "Controller-Key" und "Key Path" auf einen Wert gesetzt. Beim Slider habe ich es genau so eingestellt. Jetzt kann ich mit dem Slider den Wert des Textfeldes verändern.

    Jetzt würde ich aber gern in einer Methode im Code den Text vom Textfeld ändern - und das per Binding (da das Textfeld ja das Binding hat"

    Wie kann ich denn im Code sagen, dass es den Controller X nehmen soll, den Controller-Key Y und den Key-Path Z?
    Weil so müsste das ja gehen.

    Danke und Gruß
  • Ahh - danke.
    So wie ich das da verstanden hab, muss ich ein Outlet erstellen. Dann binde ich das Outlet an mein Bindings-Ding:

    Quellcode

    1. [titleView bind:@"value"
    2. toObject:mainController
    3. withKeyPath:@"selection.title"
    4. options:nil];

    Und dann kann ich den Wert des Outlets ändern...
    Stimmt das so in etwa?
  • Du musst überhaupt keine Outlets verwenden. Das dient in Beispiel lediglich dazu, die beiden Objekte zu finden.

    Wenn du irgendwoanders her deine Objkete bekommst oder erst zur Laufzeit instantierst, gehst du genau so vor. Liegen denn deine Objekte in jedem Fallle im Nib?

    Entscheidend ist nur die Methode und dass du daran denkst, dass der gesplitette Pfad im IB in Wahrheit ein verketteter ist.
    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"?
  • Ne, zur Laufzeit wird da nix gemacht - alle Objekte (das Textfeld *g*) sind in der nib.
    Wenn ich mir

    Quellcode

    1. [titleView bind:@"value"
    2. toObject:mainController
    3. withKeyPath:@"selection.title"
    4. options:nil];

    so anschaue, merke ich, dass das ja eigentlich gar nicht das ist, was ich brauche.
    Das Binding zwischen Textfeld und Controller besteht ja schon... Ich will ja nur per Code in "mainConrtoller.selection.title" reinschreiben können...hmm..
  • Ich würde gern im Code (sagen wir mal in der awakeFromNib) den Inhalt des Textfeldes ändern. Allerdings nicht über ein Outlet sondern über die Bindigs. Das Textfeld ist schon "gebindet" *g* nur muss ich ja irgendwie in diesen "Binding-Container" was reinlegen können, was dann im Textfeld landet. Daran hapert's im Moment noch...
  • "gebunden" ;)

    in welchem -awakeFromNib? Eines Model-Objektes, eines Controller-Objektes oder eines View-Objektes. Das macht einen Unterschied.

    Übrigens ist die Auswahl nicht beliebig. Du _solltest_ es bei gewissen Gründen von gewissen Stellen aus machen.
    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"?
  • Original von Tom9811
    "gebunden" ;)

    in welchem -awakeFromNib? Eines Model-Objektes, eines Controller-Objektes oder eines View-Objektes. Das macht einen Unterschied.

    Übrigens ist die Auswahl nicht beliebig. Du _solltest_ es bei gewissen Gründen von gewissen Stellen aus machen.

    Nagut, dann will ich bei einem Klick auf einen Button, dass sich der Text des Textfeldes ändert. Aber nicht mit Outlets *anmerk* ;)
  • Nein, weil er ja in einem _anderen_ View das ändern will und zwar _mutmaßlich_ bereits im Model. Das hat völlig andere Auswirkungen.

    Was du machst geht nur, wenn sich der Text im Button ändern soll, wenn man auf den Button klickt, etwa im Sinne eines Toggle.
    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"?
  • Wow - ich glaube das artet hier etwas aus (oder ich raff grad gar nix mehr)
    Ich hab ein leeres Projekt und ein Button und ein Textfeld auf nem Window.
    Der Button ist mit "machwas()" verbunden und im Textfeld ist ein Value-Bindung auf ein Controller. In "machwas()" soll dann stehen (MyController.myKey.myValue = "Hallo") - zumindest wäre das cool und eigentlich genau das, was ich mir wünsche. Nach dem ...= "Hallo" ändert sich logischerweise dann der Text des Textfeldes (weil es ja gebindet ist)
    :sick:
  • gebunden, herjeh! ;)

    Ja, es artet etwas aus. Das liegt am MVC. Man mag es auch für übertrieben halten, MVC zu implementieren, wenn irgendwo "hallo" erscheinen soll. Aber ich mutmaße, du machst das, um etwas zu lernen.

    Das Grundproblem ist, dass du ja das Text-View über die Bindung aktualisieren willst. Das ist auch absolut richtig! Bindings versprechen dir eine Reise vom View zum Model und zurück. Das kannst du a auch schon.

    Wenn du aber Methoden einbinden willst, ist das nicht mehr ganz so einfach. Glücklicherweise gibt es target-Bindings. Also, der Trick:

    1. Du schreibst eine Methode -machWas(Model) im Model. Die setzt dann den Wert:

    Quellcode

    1. -machWas {
    2. [self setMember:@"Hallo"];
    3. }


    2. Du bindest die Action des Buttons an diese Methode. Das machst du im Binding "target" des Buttons. Einfach deinen Controller auswählen, "selected Object" als Key und dann ganz unten den "Selector Name" eingeben: "machWas".

    Dann wird bei einem Klick diese Methode im Model ausgeführt.

    Sollte funktionieren.
    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"?
  • Ich versuche zur Zeit was ähnliches...
    Nur möchte ich aus einer Mehtode einen Wert in ein Quartz Composer Fenster übergeben.

    Ich hab einen Cube, dem ich in der Methode sagen möchte, wie groß er sein soll...
    Allerdings geht das ja nicht über die o.g. Methode. Hat da jemand einen Tipp?
  • Moment - also hier verstehe ich was nicht.
    Das QuartzComposer Ding hat nur 3 Bindings - kein Target (siehe Bild)
    Wenn ich da jetzt eine Methode hinterlege - wie geb ich dem Ding das Value?
    Ich muss ja dann in der Methode sowas wie "return as height.value myHeight" sagen können (geht ja logischerweise nicht)

    Gruß nochmal
  • Ich glaube, ich habe idch nicht richtig verstanden. Ich dachte, du wolltest das aus dem QC herausholen. Dann musst du ja bei dessen Controller ansetzen.

    Du willst es aber übergeben. Sorry!

    Das weiß ich leider auch nicht. Was holt denn der QC aus den Bindings?
    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"?
  • Ahh - ich glaube ich verstehe das jetzt auch.
    Also das QC hat nen patch Binding - das wird auf den Controller gesetzt mit dem Controlller-Key "patch".
    In nem Textfeld zb. setzt ich das Value-Binding auf den Controller mit dem Controller-Key "patch" und dem Wert bla.value (wobei bla der Wert ist, der im QuartzComposer-Projekt (die im Composer erstellte Datei) ge"outputtet" wurde. Also zb. height.value)

    Also übergibt der Controller alle Values für den Controller-Key "patch" an das QC Fenster und das holt sich dann da raus, was es braucht.

    Wie ich das jetzt manuell (also ohne IB) im .m code machen kann, weiß ich auch nicht.