Daten übertragen in ander Klasse

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

  • Daten übertragen in ander Klasse

    Hi Leute,
    ich habe mal eine kleine Frage bei dir ich bei Google auf keine Lösung komme…...

    Ich habe meinen ViewController (DatenweiterleitungViewController) und eine weitere Klasse (Messestand)

    In der xib habe ich ein kleines User Interface angelegt. Hier können Länge und Breite eingetragen werden.
    Ziel ist es das der User Länge und Breite eingibt und das dann anhand dieser Daten in der Klasse "Messestand" ein Grundraster erstellt wird.

    Mit festen werten in "#define" (war zum testen) funktioniert nun alles soweit ganz gut.

    Meine Code um die Daten an den Messestand zu übergeben:

    Quellcode

    1. -(IBAction)transfer:(id)sender {
    2. NSString *varlaenge = eingabelaenge.text;
    3. NSString *varbreite = eingabebreite.text;
    4. Messestand *messestand = [[Messestand alloc] init];
    5. messestand.laenge = [varlaenge floatValue];
    6. messestand.breite = [varbreite floatValue];
    7. ausgabelaenge.text = [NSString stringWithFormat:@"%.1f",messestand.laenge];
    8. ausgabebreite.text = [NSString stringWithFormat:@"%.1f",messestand.breite];
    9. NSLog(@"%@, %@",varlaenge ,varbreite);
    10. NSLog(@"%f, %f",messestand.laenge ,messestand.breite);
    11. [self.view endEditing:YES];
    12. [self.view addSubview:GrundrasterView];
    13. }
    Alles anzeigen


    Die Subview "GrundrasterView" hat als Class "Messestand" verknüpft.

    Messestand Code:

    Quellcode

    1. @implementation Messestand
    2. @synthesize laenge,breite;
    3. - (id)initWithFrame:(CGRect)frame {
    4. self = [super initWithFrame:frame];
    5. if (self) {
    6. }
    7. return self;
    8. }
    9. - (void)drawRect:(CGRect)rect {
    10. int x1;
    11. faktor = 450 / breite;
    12. x1 = faktor * laenge;
    13. if (x1 > 300) {
    14. faktor = 300/laenge;
    15. }
    16. NSLog(@"faktor: %f", faktor);
    17. NSLog(@"Länge: %@", laenge);
    18. NSLog(@"Breite: %@", breite);
    19. CGContextRef context = UIGraphicsGetCurrentContext();
    20. CGContextSetLineWidth(context, 1.0);
    21. CGContextSetStrokeColorWithColor(context, [UIColor grayColor].CGColor);
    22. CGContextSetLineWidth(context, 2.0);
    23. CGRect rectangel = CGRectMake(10, 10, breite*faktor, laenge*faktor);
    24. CGContextAddRect(context, rectangel);
    25. CGContextStrokePath(context);
    26. CGContextSetLineWidth(context, 1.0);
    27. for (int i = 1; i < breite; i++) {
    28. CGContextMoveToPoint(context, (i*faktor)+10, 10);
    29. CGContextAddLineToPoint(context, (i*faktor)+10, laenge*faktor+10);
    30. CGContextStrokePath(context);
    31. }
    32. for (int i = 1; i < laenge; i++) {
    33. CGContextMoveToPoint(context, 10, (i*faktor)+10);
    34. CGContextAddLineToPoint(context, breite*faktor+10, (i*faktor)+10);
    35. CGContextStrokePath(context);
    36. }
    37. }
    38. - (void)dealloc {
    39. [super dealloc];
    40. }
    41. @end
    Alles anzeigen


    Die NSLog Einträge sehen so aus das im ViewController die Daten alle richtig übergeben werden:
    [Session started at 2014-12-19 12:42:32 +0000.]
    2014-12-19 13:42:43.058 Datenweiterleitung[1815:b603] 3, 5
    2014-12-19 13:42:43.060 Datenweiterleitung[1815:b603] 3.000000, 5.000000

    aber in der Class Messestand nichts mehr vorhanden ist :(
    2014-12-19 13:42:43.064 Datenweiterleitung[1815:b603] faktor: inf
    2014-12-19 13:42:43.066 Datenweiterleitung[1815:b603] Länge: (null)
    2014-12-19 13:42:43.067 Datenweiterleitung[1815:b603] Breite: (null)

    Wo habe ich hier den Denkfehler ?
    Wie kann ich Daten die ein User eingegeben hat in eine andere Klasse übertragen ?
    Oder muss ich dann in der IBAction die Methode "drawRect aufrufen und da dann die Parameter übergeben ?
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • was ist denn Messestand ?
    ne UIView ?

    du machst Messestand *messestand = [[Messestand alloc] init];

    aber implementiert hast du initWithFrame ?

    BTW: du solltest dir angewöhnen englische Bezeichner zu benutzen , DatenweiterleitungViewController

    EDIT:

    Quellcode

    1. NSString *varlaenge = eingabelaenge.text;
    2. NSString *varbreite = eingabebreite.text;
    3. Messestand *messestand = [[Messestand alloc] init];
    4. messestand.laenge = [varlaenge floatValue];
    5. messestand.breite = [varbreite floatValue];
    6. ausgabelaenge.text = [NSString stringWithFormat:@"%.1f",messestand.laenge];
    7. ausgabebreite.text = [NSString stringWithFormat:@"%.1f",messestand.breite];
    Alles anzeigen



    ist denn in deinen Variablen varLaenge und breite überhaupt was drin ? ist zu dem Zeitpunkt schon was drin in den TextFields ?
    am besten setzt du mal bei
    Messestand *messestand = [[Messestand alloc] init]; einen breakpoint und guckst dir deine variablen an

    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • Wie man anhand des Logs sieht sind in meine ViewController die Daten vorhanden.
    Aber sobald ich meine Class "Messestand" aktiviert wird sind die Daten in laenge, breite nichts mehr drin.
    wie man im Konsole Protokoll sieht.

    2014-12-19 13:42:43.058 Datenweiterleitung[1815:b603] 3, 5 <----NSLog DatenweiterleitungViewController (varlaenge, varbreite)
    2014-12-19 13:42:43.060 Datenweiterleitung[1815:b603] 3.000000, 5.000000 <----NSLog DatenweiterleitungViewController (messestand.laenge, messestand.breite)
    NSLog von Messestand.h
    2014-12-19 13:42:43.064 Datenweiterleitung[1815:b603] faktor: inf <----NSLog Messestand
    2014-12-19 13:42:43.066 Datenweiterleitung[1815:b603] Länge: (null) <----NSLog Messestand.laenge
    2014-12-19 13:42:43.067 Datenweiterleitung[1815:b603] Breite: (null) <----NSLog Messestand.breite
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • Grundsätzlich habe ich natürlich auch schon mehrfach gelesen wegen Englischer Bezeichnung der Methoden, Instanzen, usw.
    Und natürlich macht das auch sinn bei Projekten mit mehreren Entwicklern.

    Aber bei kleinen Projekten an denen nur ich selber entwickle………Warum nicht auch deutsch für mich logische bezeichnet…… ;)
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • In der Methode transfer: erzeugst du eine Instanz von Messestand und übergibst dieser die Werte. Am Ende der Methode fügst du einen GrundrasterView (woher kommt der denn plötzlich?) dem View hinzu. Was lässt dich jetzt also annehmen, das deine Werte, die du messestand übergeben hast, nun in diesem ominösen GrundrasterView vorhanden wären?
    Nach dem Ende der Methode transfer: wird die Messestand-Instanz auch wieder freigegeben, da keine starke Referenz mehr vorhanden ist.
  • Michael schrieb:

    In der Methode transfer:[/b] erzeugst du eine Instanz von Messestand[/i] und übergibst dieser die Werte. Am Ende der Methode fügst du einen GrundrasterView[/i] (woher kommt der denn plötzlich?) dem View hinzu. Was lässt dich jetzt also annehmen, das deine Werte, die du messestand[/i] übergeben hast, nun in diesem ominösen GrundrasterView[/i] vorhanden wären?
    Nach dem Ende der Methode transfer: wird die Messestand-Instanz auch wieder freigegeben, da keine starke Referenz mehr vorhanden ist.


    Der GrundrasterView ist in der xib hinterlegt und da ist als Class "Messetand" verknüpft.

    Was muss ich ändern das die Instanz nicht so schnell freigegeben werden ?
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • Svennse schrieb:

    Der GrundrasterView ist in der xib hinterlegt und da ist als Class "Messetand" verknüpft.

    GrundrasterView ist also ein Outlet. Das würde ich aber mit kleinem 'g' am Anfang schreiben. Es handelt sich ja um eine Variable und nicht um einen Klassennamen.
    Ist der GrundrasterView im xib schon in einem Fenster abgelegt, ist das addSubview: auch nicht notwendig.

    Svennse schrieb:

    Was muss ich ändern das die Instanz nicht so schnell freigegeben werden ?

    Du erstellst gar keine lokale Instanz, denn du willst die Werte ja an den GrundrasterView im xib übergeben:

    Quellcode

    1. - (IBAction)transfer:(id)sender {
    2. NSString *varlaenge = eingabelaenge.text;
    3. NSString *varbreite = eingabebreite.text;
    4. GrundrasterView.laenge = [varlaenge floatValue];
    5. GrundrasterView.breite = [varbreite floatValue];
    6. ausgabelaenge.text = [NSString stringWithFormat:@"%.1f", GrundrasterView.laenge];
    7. ausgabebreite.text = [NSString stringWithFormat:@"%.1f", GrundrasterView.breite];
    8. NSLog(@"%@, %@", varlaenge, varbreite);
    9. NSLog(@"%f, %f", GrundrasterView.laenge, GrundrasterView.breite);
    10. [self.view endEditing:YES]; // <- wozu das?
    11. [self.view addSubview:GrundrasterView]; // <- wahrscheinlich überflüssig
    12. }
    Alles anzeigen
  • Also das ich mit meiner Namensgebung noch einiges zu Verbessern habe gehe ich voll konform mit Euch ;)

    Der GrundrasterView wird erst am ende der Action geladen und vorher nicht, von daher muss ich ihn zwingend aufrufen sonst sieht man ja nix.

    und das "endedditing" ansonsten ist von der Eingabe noch die Tastatur eingeblendet und die soll ja auch weg sein :)

    [Blockierte Grafik: http://www.fremdschämtool.de/xib.png]
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • Irgendwie hast du ein generelles Verständnisproblem wie man mit Views und ViewControllern umgeht glaube ich.

    Wie wird denn dein Grundrasterview angezeigt? Ist das dein RootView oder wird das durch irgendeine Aktion angezeigt? Wenn es durch eine Aktion angezeigt werden soll,. dann ist i.d.R. der erste Weg den man geht durch eine Seque (Wenn Storyboard benutzt wird) oder einen presentViewController bzw. pushViewController bei normalen XIB Dateien.
    Geladen wird so ein ViewController entweder vom Storyboard oder du lädst ihn mit initWithNibName: o.ä.
    Auf jeden Fall muss es einen Controller geben für Dein View. Man hängt nicht einfach alle Views in einen ViewController.

    Also versuch erst einmal ein schlüssiges Konzept zu machen, wie Deine ViewHirarchie eigentlich sein soll.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Aktuell hat mein Auftraggeber genau wegen so einem schieß ein Riesen problem. In dem Fall hat ein französischer Techniker vor 20 Jahren eine software in französischen Quellcode geschrieben. Damals war es nur ein kleines Tool das ihm selber bei seiner Arbeit helfen sollte. Heute ist es das wichtigste Tool aller Techniker der Firma. Das hat er damals nicht voraus gesesehen aber jetzt steht er 1 Jahr vor der Rente und der Konzern hat niemanden der diecsoftware weiter warten kann. Denn alle anderen Entwickler die sich mit der Thematik auskennen sind keine Franzosen......

    es es macht immer Sinn eine software in der Weltsprache zu schreiben die jeder verstehen kann. Es gibt absolut kein Argument was dagegen spricht.

    Gruss

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    . Es gibt absolut kein Argument was dagegen spricht.



    Doch: die Fachlichkeit. Wenn du mal in einem großen Projekt warst mit dickem Lastenheft und Glossar, alles auf deutsch, z.B. Bei einer Behörde, dann gibt es gute Gründe dafür. Du musst dir nämlich keinen englischen Begriffe für deutsche domänen-spezifische Fachbegriffe ausdenken. schlimm wird es wenn sich da jeder Entwickler für bestimmte Properties eigene Übersetzungen ausdenkt. Nimm z.B. Mal "Kunden-ID" und "Benutzerkennung" Was meint der Entwickler jetzt mit "setUserID"? Erstens oder letzteres? Dann doch lieber "setBenutzerkennung"
    Meiner Meinung nach sollte gerade das Modell Begriffe in der domänen-spezifischen Sprache verwenden

    Gruß

    Gandhi
  • gandhi schrieb:

    Thallius schrieb:

    . Es gibt absolut kein Argument was dagegen spricht.



    Doch: die Fachlichkeit. Wenn du mal in einem großen Projekt warst mit dickem Lastenheft und Glossar, alles auf deutsch, z.B. Bei einer Behörde, dann gibt es gute Gründe dafür. Du musst dir nämlich keinen englischen Begriffe für deutsche domänen-spezifische Fachbegriffe ausdenken. schlimm wird es wenn sich da jeder Entwickler für bestimmte Properties eigene Übersetzungen ausdenkt. Nimm z.B. Mal "Kunden-ID" und "Benutzerkennung" Was meint der Entwickler jetzt mit "setUserID"? Erstens oder letzteres? Dann doch lieber "setBenutzerkennung"
    Meiner Meinung nach sollte gerade das Modell Begriffe in der domänen-spezifischen Sprache verwenden

    Gruß

    Gandhi


    Sehr schlechtes beispiel: Kunden-id ist natürlich customerId und benutzerkennung ist userId

    ich wüsste nicht warum es Begriffe geben sollte die man nicht übersetzen kann
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    Irgendwie hast du ein generelles Verständnisproblem wie man mit Views und ViewControllern umgeht glaube ich.


    Hallo Claus,
    irgendwie habe ich das Gefühl je mehr Bücher ich lese und je mehr Tutorials ich anschaue umso verwirrter bin ich :/

    Also in meinem ViewController wir ja die xib Datei initaisliert……
    Der Grundraster View wird ja auch angezeigt, das ist ja auch nicht das Problem.

    Mein Problem ist ja lediglich das die beiden Werte (länge, breite) bei der Eingabe vorhanden sind und sobald der GrundrasterView dem Root View hinzugefügt wird und dadurch die Class Messestand aufgerufen wird, die Daten im Messestand nicht mehr vorhanden sind.
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • Svennse schrieb:

    Mein Problem ist ja lediglich das die beiden Werte (länge, breite) bei der Eingabe vorhanden sind und sobald der GrundrasterView dem Root View hinzugefügt wird und dadurch die Class Messestand aufgerufen wird, die Daten im Messestand nicht mehr vorhanden sind.

    Ich habe dir hier bereits die Lösung hin geschrieben. Übergebe die Werte der Instanz im xib, also dem GrundrasterView. Alternativ kannst du natürlich auch die Instanz im xib komplett löschen und in der transfer: Methode eine neue Instanz erstellen (dann aber mit initWithFrame:) und diese dann mit addSubview: in die View Hierarchie einsetzen.

    Und mal grundsätzlich: Klassen werden nicht aufgerufen, sondern man erstellt Instanzen einer Klasse und arbeitet mit den Instanzen. Es kann auch mehr als eine Instanz einer Klasse geben.
  • Thallius schrieb:

    Sehr schlechtes beispiel: Kunden-id ist natürlich customerId und benutzerkennung ist userId

    Ne, sehr gutes Beispiel! Für Dich ist das klar, ich denke mir da aber "loginName" und "customerID". Der nächste wiederum tut's mit "login" und "userName" übersetzen. Und schon hat man drei verschiedene Ausdrücke für die gleiche Property.

    Mir ist z.B. mal ein "Tendenzbetrieb" über den Weg gelaufen. Da wird's mit englischer Übersetzung ganz mau.

    Was spricht gegen die Verwendung von deutsch? Du sollst doch klar verständlichen Code schreiben und keine tolle englische Prosa. Und wenn nach einigen Jahren irgendjemand das Zeug anpassen/warten muss, dann muss er bei "objekt.getUserID()" überlegen was gemeint ist, bei "objekt.getBenutzerkennung()" ist alles klar, weil der gute Entwickler hat ja das Fachkonzept gelesen und weiß was die Benutzerkennung ist. Bei allen anderen muss er raten

    ciao

    gandhi