OS X Swift 4 NSView Anzeige aktualisieren

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

  • OS X Swift 4 NSView Anzeige aktualisieren

    Hallo,

    in meinem ViewController habe ich ein Custom View Objekt eingebetet, welchem ich eine eigene Class (ViewStatistic) zugeordnet habe. Wenn ich nun Elemente via draw-Funktion (aus der ViewStatic) ausgebe funktioniert dies aber mit einem zeitlichen Verzug.

    Des weiteren habe ich dem Custom View ein IBOutlet (imageSkale) zugeordnet.

    Mit nachfolgendem Quellcode lässt sich der VIEW jedoch nicht aktualisieren, was habe ich hier vergessen?

    Quellcode

    1. imageSkale.updateLayer()
    Danke mal vorab.
  • OSXDev schrieb:

    in meinem ViewController habe ich ein Custom View Objekt eingebetet, welchem ich eine eigene Class (ViewStatistic) zugeordnet habe. Wenn ich nun Elemente via draw-Funktion (aus der ViewStatic) ausgebe funktioniert dies aber mit einem zeitlichen Verzug.
    In Cocoa zeichnest du niemals direkt auf den Schirm, sondern wartest, bis das System die draw(rect:) deines Views aufrufst. Wie MCDan bereits schrieb, kannst du über needsDisplay aber einen View zum Neuzeichnen markieren.

    Ein solcher zeitlicher Verzug entsteht häufig bei lang dauernden Operationen, die den Main-Thread blockieren. Lange Berechnungen solltest du in Hintergrund-Threads packen. Wenn sie die Views aktualisieren, müssen sie das allerdings immer über den Main-Thread machen.
    „Meine Komplikation hatte eine Komplikation.“
  • @MCDan, @macmoonshine: Vielen Dank für die Hinweise und Erklärungen. Funktioniert einwandfrei.


    Also eine Frage zu dem Thema habe ich noch. Ich gebe mit dem nachfolgendem Quellcode einen Hinweis aus. Es wird nun alles aktualisiert und an der richtigen Stelle ausgegeben, aber die vermeintlich "alten" Ausgaben bleiben nun erhalten? Dies war zuvor nicht der Fall.


    Quellcode

    1. let txtField : NSTextField = NSTextField()
    2. txtField.frame = CGRect(x: 24, y: startPunktY, width: 30, height: 15)
    3. txtField.backgroundColor = NSColor.clear
    4. txtField.font = NSFont.systemFont(ofSize: cfgSchriftgrosse)
    5. txtField.stringValue = String(information)
    6. self.addSubview(txtField)
    Woran könnte dies liegen? Dies betrifft auch nur das Objekt txtField. Wie kann ich alle NSTextfield vor der erneuten Ausgabe löschen?

    P.S.: Den ganzen View zu löschen ist keine Lösung, dass funktioniert zwar aber die Berechnungen - wie bereits von "macmonnshine" angemerkt - sind einfach zu umfangreich. Außerdem wäre dies auch eine Verschwendung von Rechenzeit.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von OSXDev ()

  • MCDan schrieb:

    Wo steht dieser Code denn jetzt und wird dieser mehrmals ausgeführt?

    Über das Property subviews von NSView erhältst Du alle Subviews. Diese kannst Du dann per removeFromSuperview() erntfernen.

    Benötigst Du ein TextField, in welches der User etwas eingeben kann, oder möchtest Du mit dem TextField einfach nur Text in dem View anzeigen?
    Der Quellcode für das NSTextField steht nun in der Class (ViewStatistic) und nicht mehr in der draw(_:) Methode.

    Wenn ich dies richtig interpretiere, dann ist das TextField ein eigener SubView den ich über das Property subviews von NSView mit der Methode removeFromSuperview() entfernen kann. Klingt prima - eigentlich genau was mir fehlt.

    Das TextField dient lediglich der Infomationsausgabe im View. Gibt es hierzu Alternativen?
  • OSXDev schrieb:


    Das TextField dient lediglich der Infomationsausgabe im View. Gibt es hierzu Alternativen?

    Warum erzeugst Du im Code, egal wo, ein NSTextField um "lediglich Information Auszugeben"? Du gehst doch auch nicht in den Baumarkt und kaufst einen neuen Lichtschalter, um lediglich das Licht im Zimmer anzumachen! ;)
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?