NSProgressIndicator Darstellungsfehler

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

  • NSProgressIndicator Darstellungsfehler

    Hat jemand eine Idee was ich dagegen machen kann?
    [Blockierte Grafik: http://img.skitch.com/20090405-rx3d144qn6u2qthisrjmegncfm.preview.jpg]Click for full size - Uploaded with plasq's Skitch

    Ist ein NSCollectionView in einem NSPanel. Der ProgressIndicator ist an ein BOOL gebunden und schaltet sich ab wenn er nicht mehr gebraucht wird (das Icon Preview geladen ist).

    Die Fehldarstellung verschwindet wenn das Window resized wird und taucht auch nicht immer auf.
    Kann das am Multithreading liegen?
  • Hallo,

    Die Fehldarstellung verschwindet wenn das Window resized wird und taucht auch nicht immer auf.


    Ich habe als solches keine Ahnung, aber ich würde mutmaßen:

    Beim Verschieben, Resize oder was auch immer wird die GUI aktualisiert.
    Wahrscheinlich standardmäßig eine Aktion, die dabei aufgerufen wird.

    Konsequenterweise wird es sicherlich auch ein Update-Befehl für die GUI geben (repaint, redraw, update oder so ähnlich), den Du manuell anstoßen kannst.

    Ich würde auf das betreffende View-Element dieses ansetzen.

    Viele Grüße
  • Hallo,

    Ich könnte mir aber auch gut vorstellen das es an meinem Code liegt und sich ganz verhindern lässt.


    Dann zeige ihn doch ;)

    Ja das stimmt schon [window display] lässt es verschwinden. Aber deswegen taucht es trotzdem noch auf, ist also eher ein workaround.


    In denen von mir vertrauten Sprachen ist es üblich eine Anweisung zur Aktualisierung der Oberfläche zuschicken.

    Aber wie bereits erwähnt führen sicherlich einige Elemente die Aktualisierung nach Änderung selbstständig durch.
    Dazu werden Dir aber hier erfahrenere Entwickler mehr sagen können.

    Viele Grüße
  • Original von little_pixel
    Hallo,

    Ich könnte mir aber auch gut vorstellen das es an meinem Code liegt und sich ganz verhindern lässt.


    Dann zeige ihn doch ;)

    Kann ich machen ist aber glaube nicht so Hilfreich:

    Quellcode

    1. -(void)getPreviewForFiles:(NSArray*)files{
    2. for (FKSelectFile* item in files) {
    3. item.icon = [NSImage imageWithPreviewOfFileAtPath:item.path ofSize:NSMakeSize(40, 40) asIcon:YES];
    4. item.load = NO;
    5. }
    6. [[self window] display];
    7. }


    Das ist im Prinzip der Kern, welcher in einem Backround Thread läuft. Der ProgressIndicator ist an item.load gebunden. ich hab auch schon versucht die Änderung probehalber im MainThread ablaufen zu lassen was aber nicht geholfen hat.

    Original von little_pixel
    n denen von mir vertrauten Sprachen ist es üblich eine Anweisung zur Aktualisierung der Oberfläche zuschicken.

    Macht man ja in cocoa auch, nur eigentlich nicht bei Bindings, dachte ich immer. Zumal mach ich es noch nicht an der "richtigen Stelle" da man es trotzdem noch kurz zu sehen bekommt.

    Aber auf jeden fall danke little_pixel
  • Original von little_pixel
    Hallo,

    Ich könnte mir aber auch gut vorstellen das es an meinem Code liegt und sich ganz verhindern lässt.


    Dann zeige ihn doch ;)

    Ja das stimmt schon [window display] lässt es verschwinden. Aber deswegen taucht es trotzdem noch auf, ist also eher ein workaround.


    In denen von mir vertrauten Sprachen ist es üblich eine Anweisung zur Aktualisierung der Oberfläche zuschicken.

    Das ist zu ungenau: Ein Befehl zur Aktualisierung der Daten oder ein Befehl zur Aktualisierung der Anzeige? Die Anzeige ist alleine Sache des Views (MVC) und daher wäre eine Sprache (es dürfte sich eher um das Framework handeln), die so etwas zulässt, ziemlich unstrukturiert.

    Negm-Awad, Objective-C und Cocoa I, S. 398.

    Original von little_pixel
    Aber wie bereits erwähnt führen sicherlich einige Elemente die Aktualisierung nach Änderung selbstständig durch.

    Auch ein View weiß ja nicht, dass sich die angezeigten Eigenschaften verändert haben. Daher muss dies mitgeteilt werden (Setter, Data-Source (reloadData) oder Bindings). Die Konsequenzen daraus, wenn sich etwas verändert hat, muss jedoch das View selbst finden.

    Original von little_pixel
    Dazu werden Dir aber hier erfahrenere Entwickler mehr sagen können.

    Ja :)
    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"?
  • Hallo karrade,

    da hier kein Code zu sehen ist, bleibt auch mir nur eine Mutmaßung: hast Du schon mit setNeedsDisplay: einer View und davon Abgeleiteten herumgespielt?

    Das Aufrufen der Methode display soll eigentlich nie direkt erfolgen, da man so die Optimierung der Zeichenreihenfolge von Cocoa durchbricht. Wenn eine View needsDisplay gesetzt hat, wird diese danach neu gezeichnet und alle Überlappungen berücksichtigt, weswegen die Methode drawRect: einer View auch ein NSRect übergeben bekommt, das beschreibt, wo genau gemalt werden muss.

    Mit dem NSProgressIndicator gibt es häufiger Probleme beim Aktualisieren seiner Ansicht. Ich denke, das geht auch in deine Richtung, weil Du ja eine korrekte Anzeige erreichen willst - die Du ja bekommst, wenn Du es manuell erledigst - beim Vergrößern z.B. Hier mal noch ein paar Links zu Mails auf cocoa-dev und ein Programmbeipsiel für eine recht einfache Lösung ohne zu komplex zu werden.

    Threaded Display
    Schleife mit kurzer Ausführungsdauer im main thread
    Beispiel mit externer Referenz auf einen NSProgressIndicator

    Gruß,

    Frank
  • RE: NSProgressIndicator Darstellungsfehler

    Original von karrade
    Hat jemand eine Idee was ich dagegen machen kann?
    [Blockierte Grafik: http://img.skitch.com/20090405-rx3d144qn6u2qthisrjmegncfm.preview.jpg]Click for full size - Uploaded with plasq's Skitch

    Ist ein NSCollectionView in einem NSPanel. Der ProgressIndicator ist an ein BOOL gebunden und schaltet sich ab wenn er nicht mehr gebraucht wird (das Icon Preview geladen ist).

    Die Fehldarstellung verschwindet wenn das Window resized wird und taucht auch nicht immer auf.
    Kann das am Multithreading liegen?

    Typischer Fall von gerechter Strafe für die "kewlen schwarzen Fenster". *g*

    Hast du mal ne Subclass versucht, bei der -isOpaque NO liefert?
    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"?
  • Hallo,

    ich habe nur meine Vermutungen kundgetan, die ihm möglicherweise einen Denkanstoß gibt.
    Ich bin mir aber sicher, dass er weitgehend mehr Ahnung hat wie ich ;)

    Negm-Awad, Objective-C und Cocoa I, S. 398.


    Lese ich doch gleich heute Abend nach.

    Ja :)


    Okay, ich bin dann ruhig und bilde mich dann mit "heimlichen" mitlesen weiter ;)

    Viele Grüße
  • Das sollte kein Vorwurf von mir sein!

    Übrigens ist es dort so, dass ich gerade für PIs sogar ein explizites -display propagiere. Es sollte aber bitte, bitte die Ausnahme bleiben. Threads zu diesem Thema gibt es hier genug.

    Apropos Threads, @OP: Du aktualisierst aber nicht aus einem Thread heraus?
    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"?
  • Doch wie schon mehrfach geschrieben, ist nicht im Mainthread. Aber ich habe es auch versucht im Mainthread zu mache, keine änderung.
    Ja ich ändere das Model an der Stelle.
    Wie schon gesagt will ich die Display Methode eigentlich nicht benutzen.
    An die eigentlichen Views komme ich da es sich um einen CollectionView handelt nicht so leicht ran.
    Vllt hilft es wenn ich den ImageView über den ProgressIndicator lege.
    So erstmal Vorlesung...
  • Original von Amin Negm-Awad
    Apropos Threads, @OP: Du aktualisierst aber nicht aus einem Thread heraus?

    Hast du an der stelle noch einen Hinweis für mich? Ich komme nämlich nicht wirklich weiter.
    Wie gesagt im Thread wird nur das Model aktualisiert.

    EDIT:
    Im Übrigen scheint das ganze nur mit dem "Spinning" Indicator aufzutreten, mit der Progessbar geht alles wunder'bar'.
  • RE: NSProgressIndicator Darstellungsfehler

    Original von karrade
    Hat jemand eine Idee was ich dagegen machen kann?
    [Blockierte Grafik: http://img.skitch.com/20090405-rx3d144qn6u2qthisrjmegncfm.preview.jpg]

    Versuchs doch mal mit:

    Quellcode

    1. [myProgressIndicator setControlTint:NSClearControlTint];
    Gruß

    [EDIT]OK, das bringt wohl doch nichts. Ich hatte vermutet, dass der "Tint" so etwas wie der Hintergrund ist und "Clear" eben bedeutet, dass der durchsichtig ist. Aber da habe ich mich glaube ich vertan, sry[/EDIT]
    Hoecker-Plot - eine neue Auswertungsmethode für Digitalproofs - http://www.hoecker-plot.de