Label ändert sich nicht

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

  • Label ändert sich nicht

    Hallo liebe Community!

    Ich habe gerade versucht einen kleinen Countdown zu programmieren, aber schon relativ schnell hakt es dort :(
    Undzwar habe ich eine while Schleife, in der das Label, wo die Zeit drin steht, immer wieder aktualisiert werden soll, nur leider ändert es sich nur einmal - undzwar ganz am Ende!
    Habe es auch schon mit einer 2. Funktion, nur mit dem ändern versucht, doch nichts funktioniert :(

    Hier mein Code:

    Quellcode

    1. #import "CountdownController.h"
    2. @implementation CountdownController
    3. - (IBAction)pushStart:(NSButton *)sender {
    4. sec = 5;
    5. min = 0;
    6. hour = 0;
    7. while(sec > 0 && min >= 0 && hour >= 0) {
    8. sleep(1);
    9. [self nextCount:@""];
    10. }
    11. }
    12. - (IBAction) nextCount: (id) sender {
    13. if(sec == 0 && min > 0)
    14. min--;
    15. else if(min == 0 && hour > 0)
    16. hour--;
    17. else if(sec > 0)
    18. sec--;
    19. NSString* newString = [NSString stringWithFormat:@"%i:%i:%i", hour, min, sec];
    20. [CountdownLabel setStringValue:newString];
    21. }
    22. @end
    Alles anzeigen


    Hoffe ihr könnt mir helfen und vlt. auch zeigen, wie man das ganze besser machen kann :)


    Danke schonmal!!

    LG ThePat
  • UI Änderungen aller Art passieren nur in den Runloop. Solange Du also in Deiner Schleife bist und nicht in die Runloop zurück kehrst passiert auch nichts.
    Ausserdem ist die Lösung mit dem Sleep sehr suboptimal. Schau dir mal NSTimer an und mach es damit.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Erstmal Danke für die schnelle Hilfe! :)

    @ramo
    Vielen Dank für das Beispiel, nur eine Sache im coder verstehe ich mittlerweile nicht. Undzwar die Funktion/Methode zeitAnzeige. Ich versteh nicht wirklihc, was dort gemacht wird :( Könntest du (oder auch gerne jemand anderes) mir das vlt. erklären? Danke!! :)
  • ThePat schrieb:

    Erstmal Danke für die schnelle Hilfe! :)

    @ramo
    Vielen Dank für das Beispiel, nur eine Sache im coder verstehe ich mittlerweile nicht. Undzwar die Funktion/Methode zeitAnzeige. Ich versteh nicht wirklihc, was dort gemacht wird :( Könntest du (oder auch gerne jemand anderes) mir das vlt. erklären? Danke!! :)


    In der Methode "zeitAnzeige" wird mit "NSNumberFormatter" wie der Name schon sagt, die Anzeige so formatiert, dass 00:00:00 angezeigt wird. Die Anzeige würde auch mit
    self.anzeige.text = [NSString stringWithFormat:@"%i:%i:%i", std, min, sek]; funktionieren, aber eben nicht formatiert.
  • ramo schrieb:

    ThePat schrieb:

    Erstmal Danke für die schnelle Hilfe! :)

    @ramo
    Vielen Dank für das Beispiel, nur eine Sache im coder verstehe ich mittlerweile nicht. Undzwar die Funktion/Methode zeitAnzeige. Ich versteh nicht wirklihc, was dort gemacht wird :( Könntest du (oder auch gerne jemand anderes) mir das vlt. erklären? Danke!! :)


    In der Methode "zeitAnzeige" wird mit "NSNumberFormatter" wie der Name schon sagt, die Anzeige so formatiert, dass 00:00:00 angezeigt wird. Die Anzeige würde auch mit
    self.anzeige.text = [NSString stringWithFormat:@"%i:%i:%i", std, min, sek]; funktionieren, aber eben nicht formatiert.


    mit

    self.anzeige.text = [NSString stringWithFormat:@"%02i:%02i:%02i", std, min, sek];

    gehts dann aber auch formatiert.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Danke für die Hilfe!!
    Hab jetzt alles abgeändert und den Timer eingebaut :)

    Wen es interessiert, hier der Code:

    Quellcode

    1. #import "CountdownController.h"
    2. @implementation CountdownController
    3. @synthesize sekunde, CountdownLabel;
    4. - (IBAction) pushStart: (id) sender {
    5. std = 1;
    6. min = 1;
    7. sek = 15;
    8. if(![sekunde isValid])
    9. sekunde = [NSTimer scheduledTimerWithTimeInterval: 1.0
    10. target: self
    11. selector: @selector(countDown:)
    12. userInfo: nil
    13. repeats: YES];
    14. }
    15. - (void) countDown:(NSTimer *) timer {
    16. if(sek == 0 && min == 0 && std == 0) {
    17. [CountdownLabel setStringValue:@"Zeit ist abgelaufen!"];
    18. sekunde.invalidate;
    19. return;
    20. }
    21. if(sek == 0 && min != 0) {
    22. sek = 59;
    23. min--;
    24. [self zeitAnzeige];
    25. return;
    26. }
    27. if(sek == 0 && min == 0) {
    28. sek = 59;
    29. min = 59;
    30. std--;
    31. [self zeitAnzeige];
    32. return;
    33. }
    34. sek--;
    35. [self zeitAnzeige];
    36. }
    37. - (void) zeitAnzeige {
    38. [CountdownLabel setStringValue:[NSString stringWithFormat:@"%02i:%02i:%02i", std, min, sek]];
    39. }
    40. - (void) dealloc {
    41. sekunde.invalidate;
    42. sekunde = nil;
    43. CountdownLabel = nil;
    44. [super dealloc];
    45. }
    46. @end
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ThePat ()