2011-01-09 14 views
3

Ich habe eine benutzerdefinierte UIView, die eine Unteransicht einer UITableViewCell ist. Wenn die Zelle gezeichnet wird, ist es auch meine benutzerdefinierte Ansicht, die korrekt drawRect aufruft: in meiner UIView-Unterklasse. Wenn die Zelle neu geladen wird, wird die Ansicht korrekt gezeichnet (drawRect: wird aufgerufen).Warum wird meine UIView-Unterklasse nicht neu gezeichnet, nachdem ich setNeedsDisplay aufgerufen habe?

Wenn ein bestimmtes Ereignis eintritt (zB Timer), möchte ich die Ansicht neu zeichnen, ohne die ganze Zelle neu laden zu müssen. (Dies ist nicht die einzige Ansicht in der Zelle.)

Wenn ich jedoch setNeedsDisplay auf meiner Unteransicht aufrufen, passiert nichts.

Ich vermute, dass, wenn meine Ansicht drawRect: genannt wird, ist das resultierende Bild in einem Träger irgendwo zwischengespeichert wird, so dass, wenn ich rufe setNeedsDisplay dass Unterstützung ist auf den Bildschirm neu gezeichnet, aber mein drawRect: Anruf wird nie wieder genannt.

Warum wird drawRect: nie wieder aufgerufen, nachdem die Zelle erstellt wurde?

BEARBEITEN: Die Unteransichten der Zelle werden aus einer Feder erstellt. Dh: Ein UIViewController wird von der Nib geladen und seine Sicht wird der UITableViewCell hinzugefügt.

Ich habe einen Testfall von Grund auf mit einer benutzerdefinierten Ansicht erstellt, die nicht von einer Feder geladen wird (erstellt von Code) und es funktioniert wie erwartet: setNeedsDisplay führt zu einem drawRect: Aufruf. Es muss etwas sein, das entweder in der .xib-Datei eingerichtet ist oder etwas, das anders als eine Ansicht passiert, wenn es von einer Nib geladen wird.

+0

Nennen Sie SetNeedsDisplay aus dem Hauptthread? Sind Sie sicher, dass Sie es an die richtige Ansicht senden (dh es sollte in Ordnung sein, wenn von der Zelle aus getan, aber könnte leicht falsch gemacht werden, wenn * irgendwo * und die Zelle wurde ersetzt (dh durch Scrollen). – Eiko

+0

Ja, wir brauchen etwas mehr Code – vodkhang

+0

Ja, setNeedsDisplay wird aus dem Haupt-Thread aufgerufen. Ich habe sogar versucht, es mit performSelectorOnMainThread zu verzögern: ... keine Freude.Siehe die Bearbeitung über die Ansicht aus der Nib (.xib) -Datei. –

Antwort

1

Ich lief gerade das gleiche Problem selbst. Für mich war es ein Problem mit meiner XIB - ich untergliedere eine UIView obwohl - passen Sie sich dementsprechend an. Mein Fehler in IB war, dass ich meine Steuerelemente an den "Eigentümer der Datei" anschloss, anstatt sie an die UIView anzuhängen. Ich bin mir sicher, dass in meiner Unerfahrenheit etwas Größeres vor sich geht - vielleicht kann jemand mit etwas mehr Erfahrung das ausarbeiten.

Hoffe, dass hilft!

Verwandte Themen