ValueTransformer friert Textfeld

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

  • ValueTransformer friert Textfeld

    Hallo mal wieder.
    Aufgabe: Das Textfeld darf nur ungerade Integer erlauben, der Transformer erhöht den Wert um1, wunderjut.
    Im TextFeld steht aber eine 0 und es ist gefroren.
    Hier der Code in appdelegate initialize:

    Quellcode: appdelegete.m

    1. +(void)initialize
    2. {
    3. VRValueTransformer * valueTransformer;
    4. valueTransformer = [[VRValueTransformer alloc]init];
    5. [NSValueTransformer setValueTransformer:valueTransformer forName:@"EvenToOdd"];
    6. }
    und hier der Transformer:

    Quellcode: VRValueTransformer.m

    1. @implementation VRValueTransformer
    2. + (Class)transformedValueClass
    3. {
    4. return [NSNumber class];
    5. }
    6. + (BOOL)allowsReverseTransformation {
    7. return NO;
    8. }
    9. - (id)transformedValue:(id)value
    10. {
    11. // I need an odd value
    12. NSUInteger oddValue = [value integerValue];
    13. if(oddValue%2 == 0) value = [NSNumber numberWithInteger:oddValue+=1];
    14. return (value == nil) ? nil : NSStringFromClass([value class]);
    15. }
    16. @end
    Alles anzeigen
    Wenn ich im UI Transformerfeld Blah eintrage, gibt's eine Fehlermeldung.


    Ich danke euch iim Voraus, hoffentlich hat jemand Langeweile. ;)
    Uwe
    How come I can't see me in my mirror ?
  • Naja, der Code stammt aus einem Beispiel:
    A relatively trivial value transformer takes an object of type id and returns a string based on the object’€™s class type. This transformer is not reversible as it’s probably unreasonable to transform a class name into an object. The value transformer class you write to accomplish this simple task could look like:
    Das dieser nicht 1:1 für eine ganz anders gewünscht Transformation genutzt werden kann, dürfte klar sein. Hier ist Transferleistung gefragt.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Dylans Ghost schrieb:

    Apple schrieb:

    1. - (id)transformedValue:(id)value {
    2. return (value == nil) ? nil : NSStringFromClass([value class]);

    s. Xcode/Window/Documentatio and API Reference/NSValueTransformer
    Ähm, das Beispiel transformiert eine Klasse in einen String. Du willst eine Number-Instanz in einer Number-Instanz (mit anderem Wert) transformieren. Also liefere doch die berechnete Number-Instanz zurück?

    Darüber hinaus:

    A. Wieso benutzt du zur Wertänderung einen Value-Transformer. Das ist ein Value-*Transformer*, kein Value-*Editor*. Ich halte das schon für die falsche Baustelle. Aber gut, wenn's schee macht …

    B. Überflüssiger Zuweisungsoperator

    Quellcode

    1. if(oddValue%2 == 0) value = [NSNumber numberWithInteger:oddValue+=1];

    Was soll hier der Zuweisungsoperator +=? oddValue wird danach überhaupt nicht mehr benutzt. Wir beten zu dem Optimierer, clangu akbar!

    C. Überflüssiger konditionaler Ausdruck

    Quellcode

    1. return (value == nil) ? nil : NSStringFromClass([value class]);

    Doku hin, Doku her, die Abfrage ist überflüssig und wird in NSStringFromClass() ohnehin schon gemacht.
    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"?
  • Amin Negm-Awad schrieb:

    Was soll hier der Zuweisungsoperator +=? oddValue wird danach überhaupt nicht mehr benutzt. Wir beten zu dem Optimierer, clangu akbar!
    Ich will hier gar nix optimieren, nimm es gelassen hin, dass die Entscheidung even/odd im folgenden code einen fatalen Einfluss hat.
    Wie kommst du darauf, dass oddValue nicht mehr benutzt wird ?
    Ich muss den Wert im UI verändern können, darum nochmals die Frage: Waram erscheint oddValue (model property) als readonly ?
    How come I can't see me in my mirror ?
  • Dylans Ghost schrieb:

    Wie kommst du darauf, dass oddValue nicht mehr benutzt wird ?
    Weil Du oben Code gepostet hast und oddValue innerhalb seines Gültigkeitsbereiches (der Methode "transformedValue:") nicht mehr referenziert wird. Damit kann man sich die Zuweisung der Summe sparen, und ein "oddValue + 1" wäre sinnvoller.

    Wo erscheint was "read-only"?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Was er damit meint:
    var += 1 == var = var + 1 und da var nie wieder gelesen wird, kann sich der Compiler das Ganze auch schenken.
    Zumal var++ auch bedeutet, dass zunächst mit var gearbeitet und der Wert dann erhöht wird. Könnte bei var += 1 ähnlich sein.
    Du meinst (oddvalue + 1);

    Aber mal ernsthaft:

    C-Quellcode

    1. - (id)transformedValue:(id)value
    2. {
    3. // I need an odd value
    4. NSUInteger oddValue = [value integerValue];
    5. if(oddValue%2 == 0) value = [NSNumber numberWithInteger:oddValue+=1];
    6. return (value == nil) ? nil : NSStringFromClass([value class]);
    7. }


    Gehen wir das doch mal Zeile für Zeile durch.
    1. Prima. War ja auch vorgegeben.
    2. Ebenso.
    3. Klingt vielversprechend.
    4. Ähm. Nein. Echt nicht.
      Erstens weißt Du überhaupt nicht, ob das wirklich ein ungerader Wert sein kann. Der Variablenname ist also mindestens unglücklich gewählt.
      Zweitens weißt Du gar nicht, ob value überhaupt auf –integerValue antworten kann. Du riskierst hier also einen schönen Absturz.
    5. Jau, wenn Dein oddValue also eigentlich ein evenValue ist, setzt Du value auf eine neue Zahl. Vielleicht. Wenn der Compiler Deine Zuweisung nicht rausoptimiert. Wovon ich ausgehen würde.
      Der Static Analyzer würde sich jedenfalls das Leben nehmen.
      Nichts desto trotz hängst Du value dann auf eine neue Instanz von NSNumber um.
    6. Gut, Du gibst hier also entweder gar nix zurück oder einen String der Klasse von Value.
      Mutmaßlich gibst Du hier immer @"NSNumber" zurück. Das hättest Du auch einfacher haben können.
    7. Hier is wieder schön.

    Dein Code macht also ungefähr dasselbe wie der hier:

    C-Quellcode

    1. - (id)transformedValue:(id)value
    2. {
    3. return NSStringFromClass([NSNumber class]);
    4. }

    Wie gesagt, der Static Analyzer würde Selbstmord begehen.
    Entweder Du bekommst irgendwas als value und das Ding kachelt Dir schlimmstenfalls ab, oder value ist nil, und oddValue == 0, woraufhin Du value manuell auf eine Instanz von NSNumber setzt. Da kommt niemals ein nil bei rum.
    (Ja, wenn value == @"1"; läuft das Ding durch. Und gibt @"NSString"; zurück. Tolles Tennis. Dieses Feature deckt meine Implementierung natürlich nicht ab. Sind aber auch zwei Zeilen weniger. So.)

    Beim Erreichen der 'Rücksprungmarke' kann value also unter keinen Umständen mehr nil sein.
    Deshalb wirfst Du sämtliche Arbeit weg und gibst den Klassennamen von value zurück.

    Und im Anschluss wunderst Du Dich ernsthaft, warum das Textfield danach sonstwas tut?

    (Warum so von oben herab? Nun, ist nicht Dein erster Post mit völlig zusammenhang– und verständnislosem Zusammengestolper von Zeichen. Ist auch nicht Dein erster Post mit Antworten voll ignoranter Arroganz. Da ich eine gewisse Diskrepanz zwischen Arroganz und Kompetenz feststelle, ein paar belehrende Zeilen. Weiterführende Hilfe kannste vergessen.)
    «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
  • Marco Feltmann schrieb:

    (Warum so von oben herab? Nun, ist nicht Dein erster Post mit völlig zusammenhang– und verständnislosem Zusammengestolper von Zeichen. Ist auch nicht Dein erster Post mit Antworten voll ignoranter Arroganz. Da ich eine gewisse Diskrepanz zwischen Arroganz und Kompetenz feststelle, ein paar belehrende Zeilen. Weiterführende Hilfe kannste vergessen.)
    Ich habe keine Kompetenz - ich bin aber nicht arrogant und :
    Wenn du keine Diskrepanz feststellen brauchtest zwischen Kompetenz und Arroganz, das wäre dann in Ordnung ? ^^

    Ich habe ein anderes Beispiel gefunden:

    Quellcode

    1. - (id)transformedValue:(id)value
    2. {
    3. int inputValue;
    4. int outputValue;
    5. - (id)transformedValue:(id)value
    6. {
    7. int inputValue;
    8. int outputValue;
    9. if (value == nil) return nil;
    10. if ([value respondsToSelector: @selector(integerValue)])
    11. inputValue = [value intValue]; // -> 4
    12. else
    13. {
    14. [NSException raise: NSInternalInconsistencyException
    15. format: @"Value (%@) does not respond to -intValue.",
    16. [value class]];
    17. }
    18. if(inputValue % 2 == 0)
    19. {
    20. outputValue = inputValue +1; // -> 5
    21. value = [NSNumber numberWithInt: outputValue];
    22. }else value = [NSNumber numberWithInt: inputValue];
    23. return value;
    24. }
    Alles anzeigen
    Ich bin den code step by step durchgegangen und der static analyser hatte nichts auszusetzen,
    trotzdem war das Textfeld (mit numberformatter) gesperrt.Ich konnte die Zahl kopieren, verhält sich also readonly.

    Die Lösung liegt hinter meinem Horizont.
    How come I can't see me in my mirror ?
  • Dylans Ghost schrieb:

    Amin Negm-Awad schrieb:

    Was soll hier der Zuweisungsoperator +=? oddValue wird danach überhaupt nicht mehr benutzt. Wir beten zu dem Optimierer, clangu akbar!
    Ich will hier gar nix optimieren, nimm es gelassen hin, dass die Entscheidung even/odd im folgenden code einen fatalen Einfluss hat.Wie kommst du darauf, dass oddValue nicht mehr benutzt wird ?
    Ich muss den Wert im UI verändern können, darum nochmals die Frage: Waram erscheint oddValue (model property) als readonly ?
    Genau lesen:

    1. Ich sagte clangu akbar, nicht Dylan abkar. Clang, nicht du, muss das wegoptimieren.

    2. In dem Code

    Quellcode

    1. {
    2. NSUInteger oddValue = [value integerValue];
    3. if(oddValue%2 == 0) value = [NSNumber numberWithInteger:oddValue+=1];
    4. return (value == nil) ? nil : NSStringFromClass([value class]);
    5. }


    Ist oddValue der Identifier eines Objektes mit lokalem Scope und Extent. Nach der geschlossenen geschweiften Klammer, kann daher oddValue nicht mehr benutzt werden. So wegen C-Sprachdefinition und so.

    3. Warum du eine lokale Variable ändern musst, um den Wert im UI zu ändern, erschließt sich mir nicht.

    Hast du es mal ohne Zuweisung ausprobiert? Ja? Nein?

    Nachdem du jetzt offenkundig wieder irgendein Code-Snippet aus dem Internet gezogen hast, wäre es vielleicht an der Zeit, die Sache mit grundsätzlichem Verständnis anzugehen.
    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"?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Amin Negm-Awad ()

  • Da bin ich aber froh, dass du dich meiner annimmst, fürchtete schon, der Clan hält die Axt bereit und die schweigende Mehrheit traut sich nicht ihm zu widersprechen.

    Wenn du einen Blick auf den Klappcode in meinem letzten Beitrag geworfen hast - da war ein geänderter Code, auch aus den Apple Dokumenten (CelsiusToFahrenheit).
    Dieser value ist eine private Klassenvariable, die Kondition in For.. Schleifen. Ich könnte natürlich den Wert beim ersten Auftreten abfragen aber das ist unsicher,wenn ich die Reihenfolge
    der relevanten Methoden ändere, denke ich vielleicht nicht mehr an die Variable,
    Ich bin gerade dabei, das Indexing im VBO-Mysterium zu implementieren, das ist eine kleine Herausforderung für mich.

    Warum ich die Variable im UI brauche ? Sie steuert die Anzahl der Vertices (um in den Animationen den Datenaufwand zu minimieren).
    Nachdem ich das ausprobiert habe, kann ich die verschiedenen Konditionen im Code festschreiben.
    Im Grunde brauch' ich den Transformer nicht mehr, wenn das Programm absackt, weiss ich wo ich zuerst hinschauen muss.
    Trotzdem würde ich gerne was dazu lernen, z.B. warum das Textfeld streikt.

    Also bitte lern mir was :)

    Uwe
    How come I can't see me in my mirror ?
  • Dylans Ghost schrieb:

    Da bin ich aber froh, dass du dich meiner annimmst, fürchtete schon, der Clan hält die Axt bereit und die schweigende Mehrheit traut sich nicht ihm zu widersprechen.
    Wozu gehöre ich nun, zum Clan oder zur schweigenden Masse? Egal, hier kann ich meinen Mund nicht mehr halten: Dir wird bestimmt aufgefallen sein, das dieser von Dir genannte Clan (manche sagen dazu auch "Regulars") aus Leuten besteht, die sich die Zeit und Mühe machen, auf die Fragen anderer Hilfestellungen zu geben. Die Masse macht das nämlich nicht, die schweigt nur.

    Diese Hilfestellung setzt aber voraus, dass man sie aktiv annimmt. Selber denken ist angesagt, Code stumpf kopieren kann jeder. Ich kopiere auch Code (wer nicht?), aber nur nach Verständnis jedes Statements. Ich stelle auch Fragen und verrenne mich manchmal. Aber ich bilde mir ein, ein Mindestmaß an Sorgfalt für die Fragestellung aufzubringen und auf Antworten reflektierend zu reagieren. Beides vermisse ich bei Dir.

    Dylans Ghost schrieb:

    Amin Negm-Awad schrieb:

    Ich würde es mit einem Buch für Anfänger probieren.
    Ein Buch hab' ich schon.Eine nicht ganz ernst gemeinte Prophezeiung:
    Wenn du dich zum Kaiser hochgepunktet hast wird ein Märchen wahr.
    Nachdem Du es Dir mit dem ein oder anderen schon verscherzt hast, stachelst Du sogar noch bei denen, die Dir helfen? Starker Auftritt, da hilft m. E. auch der Versuch eines vorangestellten Abschwächens wenig.

    Ich bin ebenfalls raus, schönes Leben noch.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Dylans Ghost schrieb:

    if ([value respondsToSelector: @selector(integerValue)]) inputValue = [value intValue]; // -> 4
    ;( :cursing: :thumbdown:

    Mir ist übrigens neu, dass ein Value Transformer irgendwas mit dem Enabled-Status eines Textfeldes zu tun hat.
    (Mal ganz davon abgesehen, dass ein Value Transformer für diesen Anwendungsfall Mist ist und das eher in die Delegate Methoden des Textfeldes gehört. Aber das wolltest Du ja vorher schon nicht wahr haben.)
    «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
  • Marco Feldmann schrieb:


    Marco Feltmann schrieb:

    Mir ist übrigens neu, dass ein Value Transformer irgendwas mit dem Enabled-Status eines Textfeldes zu tun hat.
    Da hast du recht, es ändert ja nicht nur den Status sondern auch das OutFit. Ich habe schon erwähnt dass ich den Wert kopieren konnte.
    Es liegt ein Fehler vor, interessant wäre zu wissen, ob und wie ich den provoziert habe.
    Inzwischen habe die Bedingung in die Methode verschoben, die sie els erste gebraucht, weil ich jetzt sicher bin, dass sich an der AufrufReihenfolge der verschiedenen Methoden nichts ändert.

    Noch eine Bemerkung rein philososophischer Nuancierung [Heinz Erhard]: My fancy mathematics enlighten the issues, z.B. f*(f+1), ein Rechteck mit den Seiten f und f+1 möchte gern ein Quadrat werden ;)
    How come I can't see me in my mirror ?