Count-up oder -down in NSTextField mit 10 clicks pro sekunde

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

  • Count-up oder -down in NSTextField mit 10 clicks pro sekunde

    Nach Ewigkeiten hier wieder eine Kleinigkeit:

    Ich will in einer View ein Textfield (nicht-editierbar, also Label) hochzählen. Sichtbar. Recht schnell, 5-10/s , soweit okay. Text ändern klappt ( [NSTextField setStringValue: ] ) Einziges Problem:

    Bis der Refresh kommt, hat er schon alles hochgezählt, die Änderung wird beispielsweise direkt von 1 auf 99 sichtbar.
    [View setNeedsDisplay] trifft das Problem nicht ganz und richtet sich auch auf die View und nicht an das Textfeld.
    Eine Bremsschleife einbauen tut auch nicht. Verzögert nur das Vorher. [NSThread sleepForTimeInterval] genauso.
    Ich hätte gern ein "blib-blip-blip" eines sichtbaren Text-ändert-sich-im-TextField im Sinne eines Count-ups oder -Downs.
    Wo hakts bei mir?

    Danke!
  • Kann es sein, dass der UI-Refresh nicht während des Hochzählens erfolgt, weil Du die RunLoop blockierst? Versuche doch einmal, die Aktualisierung des NSTextFields in eine eigene Methode auszulagern und diese mittels performSelectorOnMainThread:withObject:waitUntilDone: aufzurufen...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Danke! Bin ein bisschen weiter… Will Dich nicht mit meinen Anfänger-Subtopics nerven; hier aber noch eins:
    Ich zähl in einer loop hoch und ruf darin die Darstell-Methode per performSelector auf; in der ist ein [NSThread sleepForTimeInterval] drin, damit der Countup einstellbar langsam durchläuft.
    Mit performSelectorOnMainThread kommt wieder der UI-Refresh erst am Ende der Schleife, aber mit performSelector nicht im MainThread kommt der Refresh jedesmal gut durch.
    Bei performSelector:::afterDelay hab Ichs über die Delay versucht, aber die wirkt nur am Anfang einmal, dann läufts unabhängig von der eingestellten Delay (sichtbarer Refresh, aber ~100 Counts/s) durch.
    End of the day: mit performSelector (nicht MainThread) und dem sleepForTimeInterval läufts genau wie gewünscht, aber ich hab das nagende Gefühl, ich hab nicht zu Ende kapiert, wie der in Runtime die Organisation in Threads macht…

    PS: Ein Cast von NSInteger* zu (id) mag der ARC nicht, muß NSString* nehmen, oder?
  • Deine Bemerkung bzgl. Casting habe ich überhaupt nicht verstanden, ohne dem Code-Snippet wohl auch kaum möglich.

    Wirklich stutzen lässt mich aber das sleep ... das für mich bisher immer ein No-Go war. Gibt es einen Grund, warum Du den Timer inkl. Aktualisieren nicht über einen NSTimer realisierst, der in entsprechenden Intervallen gefeuert wird. Zumindest, wenn Du längere Zeitabstände willst, oben klang es noch nach „möglichst schnell“.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Das kommt davon, wenn ich gradmal alle 5 Jahre eine winzige App probiere und merke, ich hab alles vergessen… Ist nur ein kleines Nebenhobby. Trau mich daher kaum, die Profis zu fragen…
    Ich hab mal das project hochgeladen; Ziel ist, ins Textfeld irgendwas einzugeben und danach zu sehen, wie im linken Label einen Count-up läuft. Hier 1-40, langsam genug, daß man es durchlaufen sehen kann, schnell genug, daß es keine Warterei wird (War ein Gag am Beamer für eine Hochzeitsfeier, Details laß ich weg, am Schluß kam der Bräutigam auf einem echten Kamel reingeritten. Unglaublich…).

    (Eigentlich will ich mir meine kleine Klassenbibliothek machen, um bei Bedarf mal schnell und dirty sowas wie "mal eben ein Apfelmännchen oder spontane, graphische Darstellungen wirrer Ideen" zu machen, ohne jedesmal nach Jahren neu nachgucken zu müssen, wie man ein Fenster aufmacht, und warum meine NIB-Sachen von vor 12 Jahren nicht mehr laufen… Hab den Hochzeits-Gag mit Count-up und Bildern in nem kleinen bash-script gemacht, aber will jetzt mal probieren, ob ich das auch wie früher in ObjC hinkriege)

    Danke für alle Details; wenns Dir mühsam wird, laß sein! Ist nur ein bisschen Rumspielen mit Ideen…

    Thomas
    Dateien
    • NewTeich.zip

      (54,63 kB, 357 mal heruntergeladen, zuletzt: )
  • TheMas schrieb:

    Trau mich daher kaum, die Profis zu fragen…
    Dafür gibt es keinen Grund, ich bin auch nur Hobbyist in der macOS-. / iOS-Entwicklung...

    TheMas schrieb:


    Danke für alle Details; wenns Dir mühsam wird, laß sein! Ist nur ein bisschen Rumspielen mit Ideen…
    Ich habe es mir kurz angeschaut, für mehr fehlt mir wirklich die Zeit (ich möchte meine nächste App endlich auf die Straße bringen). Nur so viel: Ich würde wirklich nicht mit sleep u. ä. hantieren, sondern einen NSTimer nutzen, der regelmäßig eine Methode aufruft. In dieser ermittelst Du dann die verstrichene Zeit und aktualisierst das NSTextField. Vielleicht hilft Dir etwas dieser Code auf Github: Uralt, mit etwas "Overhead", um zu ermitteln, ob eine bestimmte App gestartet wurde, sollte er die Nutzungszeit einer App anzeigen.

    Achtung: Er geht beim Update davon aus, dass der Timer wirklich nach genau einer Sekunde gefeuert wurde, dass muss nicht sein. Besser wäre, die Zeitdifferenz zu einer Startzeit zu ermitteln...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.