takeIntValueFrom

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

  • takeIntValueFrom

    Ich will nen Slider mit einem eigenen Control verknoten, um die Werte auszutauschen, der Slider sendet den Wert den mein Control, soweit geht das, aber was muss ich implementieren, damit mein Control den Wert dem Slider schickt.
    Ich hab das so verstanden, das die takeIntValueFrom automatisch implementiert ist.
    Muss noch dazu sagen, dass ich den intValue überschrieben hab, weil ich da noch andere Sachen machen muss.
  • wolf_10de schrieb:

    Muss noch dazu sagen, dass ich den intValue überschrieben hab, weil ich da noch andere Sachen machen muss.

    Sofern du in deiner eigenen Implementierung [super intValue] aufrufst, dürfte das eigentlich nicht zu Problemen führen.
    «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
  • Sehr seltsam, ich hab mal versucht mit

    Quellcode

    1. [self setIntegerValue:100];

    den Wert zu ändern, leider ohne Erfolg, der Wert ist immer 0.
    Wenn ich von NSControl ableite hab ich ja automatisch einen integerValue, mit dem würde ich gerne arbeiten. Geht aber wie gesagt nicht, der bleibt immer Null.
  • Ja schon, wie gesagt ich hab mal ein wenig probiert und das Projekt so umgebaut um mit dem Standard integerValue bzw. setIntegerValue zu arbeiten.
    Wenn ich den Wert mit setIntegerValue setzte und an anderer Stelle wieder holen will, ist das Ding immer Null. Kein Ahnung warum.

    Wenn ich von NSControl ableite müsste ich erst mal nur um die Funktionalität herzustellen überhaupt nix tun (sprich nix überschreiben), weil ich ja automatisch die besagten Methoden
    takeIntegerFrom usw.. habe.
  • Warum ist das scheiß Ding Null?

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. @interface MyControl : NSControl
    3. @end


    Quellcode

    1. #import "MyControl.h"
    2. @implementation MyControl
    3. - (id)initWithFrame:(NSRect)frame
    4. {
    5. self = [super initWithFrame:frame];
    6. if (self) {
    7. [self setIntValue:100];
    8. }
    9. return self;
    10. }
    11. - (void)drawRect:(NSRect)dirtyRect
    12. {
    13. NSLog(@"%i", [self intValue]);
    14. }
    15. @end
    Alles anzeigen
  • Der Slider wird intValue nicht implementiert haben. Nur weil das bei NSControl die Methoden hat, müssen die noch lange nix machen, es steht halt nur das Interface bereit.

    Z.B. wird wohl der NSSlider den setFloatValue nicht einfach in einer "Ivar" speichern, sonder in der "Slidercell" und eben auch floatValue direkt irgendwie aus dem Zustand des Sliders ermitteln. Was soll den der intValue eines Sliders sein, der Prozentwert?
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Quellcode

    1. - (id)initWithFrame:(NSRect)frame
    2. {
    3. self = [super initWithFrame:frame];
    4. if (self) {
    5. [self setIntValue:100];
    6. [[self cell]setIntValue:100];
    7. }
    8. return self;
    9. }
    10. - (void)drawRect:(NSRect)dirtyRect
    11. {
    12. NSLog(@"%i", [self intValue]);
    13. NSLog(@"%i", [[self cell] intValue]);
    14. }
    Alles anzeigen

    Mir ist das mit dem Interface schon klar, aber:
    Im Prinzip geht es mir erst mal um das Beispiel oben. Wenn ich den Wert auf 100 setzte gehe ich davon aus das er auch 100 ist, ansonsten ist das voll für den Arsch.
    Auch die Cell hat den Wert nicht.

    Im anderen Beispiel mit dem Slider holt er sich den Wert über den bereitgestellten intValue, so hab ich das verstanden. Wenn ich mit [super intValue] arbeite ist das wieder Null, deswegen hab ich mal
    ein kleines Beispiel probiert (siehe oben). Wenn da natürlich immer Null drin steht, weil die beschissene Basisklasse den Wert nicht mitführt kann ich mir da lange einen Wolf suchen, woran das liegt.

    Konkret: Implementiere ich selbst nen intValue, dann funktioniert zwar meine Klasse, aber die Verknotung im IB wieder nicht, weil [super intValue] ja Null ist, bzw. mein intValue anscheinend keine Sau interessiert.
  • wolf_10de schrieb:

    Warum ist das scheiß Ding Null?

    Weil NSControl nur eine abstrakte Klasse ist und selbst keinen „Speicherplatz“ für die ganzen Values zur Verfügung stellt. NSControl greift dafür auf die cell zu, welche in diesem Beispiel ja nil ist (wurde ja keine gesetzt). Das musst in Deiner Subklasse also den Speicher für den intValue zur Verfügung stellen oder eine entsprechende NSCell-Klasse setzen.
    Damit der Slider den Wert übernimmt, musst Du ihm das sagen:

    [slider takeIntValueFrom:self];

    Michael
  • Michael schrieb:

    wolf_10de schrieb:

    Warum ist das scheiß Ding Null?

    Weil NSControl nur eine abstrakte Klasse ist und selbst keinen „Speicherplatz“ für die ganzen Values zur Verfügung stellt. NSControl greift dafür auf die cell zu, welche in diesem Beispiel ja nil ist (wurde ja keine gesetzt). Das musst in Deiner Subklasse also den Speicher für den intValue zur Verfügung stellen oder eine entsprechende NSCell-Klasse setzen.
    Damit der Slider den Wert übernimmt, musst Du ihm das sagen:

    [slider takeIntValueFrom:self];

    Michael

    Da kommen wir der Sache schon näher, deshalb hat das mit meiner eigenen intValue zumindest in eine Richtung funktioniert.
    Danke für den Hinweis.
  • Ich vermiute mal du hast einen Solider und daneben ein Textfeld. Das Textfeld beinhaltet Pixelwerte oder Prozentangaben und du willst das der Slider sich anpasst.

    Versuch mal, bei deinem Solider die setIntValue: zu überschreiben. Wenn du beim slider taketIntValueFrom: textField setzt wird textField wohl bei einer Änderung setIntValue des Sliders aufrufen - oder gleich setObjectValue des sliders.

    Dann rechnest du den int in einen Float um und setzt beim slider den floatValue
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • takeXYFrom: sind actions.

    Wenn du vom Textfield auf den Slider ziehst, ruft das Textfile bei jeder Änderung die Methode takeXYFrom: auf und übergibt sich selbst als Parameter. So wird jede Änderung an TF an den Slider übergeben.

    Das musst du in beide Richtungen machen.

    Ich hab das ehrlich gesagt auch anderst verstanden. Dache wenn ich das ein mal setze, wird bei der "From Control" automatisch der Sender hinzugefügt und feuer jedesmal auf die setXYValue. Ist aber nicht so.

    EDIT: Eben nicht der übliche Target/Action Mechanismus, sondern eine API mit der Controlls untereinander quatschen können
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Manfred Kreß schrieb:

    takeXYFrom: sind actions.

    Eben.

    Manfred Kreß schrieb:

    Wenn du vom Textfield auf den Slider ziehst, ruft das Textfile bei jeder Änderung die Methode takeXYFrom: auf und übergibt sich selbst als Parameter.

    Genau, der übliche Target/Action Mechanismus.

    Manfred Kreß schrieb:

    Das musst du in beide Richtungen machen.

    Warum? Wenn man beispielsweise nur ein Label hat, das den Wert eines Sliders anzeigen soll, reicht eine Richtung.

    Manfred Kreß schrieb:

    Ich hab das ehrlich gesagt auch anderst verstanden. Dache wenn ich das ein mal setze, wird bei der "From Control" automatisch der Sender hinzugefügt und feuer jedesmal auf die setXYValue. Ist aber nicht so.

    EDIT: Eben nicht der übliche Target/Action Mechanismus, sondern eine API mit der Controlls untereinander quatschen können

    Die takeXYFrom: Action Methoden rufen einfach xyValue des senders auf und holen sich so den xyValue. Das ist genau das Gleiche, als wenn ich in einem Controller eine Action-Methode implementiere, die den aktuellen Wert eines GUI Elements ausliest.

    Michael