2009-05-26 19 views
16

Es scheint, ich habe lange gesucht und habe keine große, einfache, Antwort auf mein Problem gefunden.NSTableView mit benutzerdefinierten Zellen

Ich verwende XCode mit Cocoa/ObjC und versuche ein NSTableView zu erstellen, das Werte aus einem NSDictionary/Array in verschiedene Abschnitte einer Zelle lädt.

Zum Beispiel versuche ich, ein NSImage, NSTextField und andere Elemente in eine benutzerdefinierte Zelle (zusammen mit einem Hintergrundbild) zu bekommen. Allerdings kann ich keine einfache Antwort darauf finden, wie man das erstellt.

Ich habe für das iPhone mit UITableViews für eine Weile jetzt codiert und kann nicht scheinen, einen ähnlichen Weg mit NSTableViews zu finden.

Jede Hilfe wäre wirklich toll!

Dank

Dominic

+0

Hier ist mein [visueller Ansatz] (http://stackoverflow.com/questions/5884265/how-to-setup-a-nstableview-with-a-custom-cell-using-a-subview) (immer noch einige Rendering Probleme) – JJD

Antwort

26

NSTableView hat -tableView:dataCellForTableColumn:row:. Erstellen Sie einfach Ihre NSCell-Unterklasse in Ihrem Delegaten und geben Sie sie zurück, wenn Sie eine Anpassung für diese Zeile benötigen. Wenn Sie nur Ihre benutzerdefinierte Zelle für jede Zeile in der Tabellenansicht verwenden, können Sie auch IB verwenden, um die benutzerdefinierte Zellenklasse festzulegen.

Die Tabellenansicht kopiert die Zelle nach Bedarf, sodass Sie die Zelle als Instanzvariable beibehalten können, wenn sie effizienter wäre. Die Datenquellenmethoden oder -bindungen in der Tabellenansicht funktionieren wie gewohnt. Nur das bearbeitete Verzeichnis wird anstelle einer einzelnen Zeichenfolge oder Nummer zurückgegeben. Sie könnten ein benutzerdefiniertes Modellobjekt auch direkt an die Tabellenansicht übergeben. Sie müssen es jedoch kopierbar machen oder setObjectValue: in Ihrer Zelle außer Kraft setzen, um es in einen NSValue zu packen.

Wenn es Unterklasse NSCell, die Ihnen Probleme gibt, kann das ein bisschen eine Lernerfahrung sein. Beginnen Sie mit -drawWithFrame:inView:, um alle Ihre benutzerdefinierten Objekte zu zeichnen, und gehen Sie von dort aus, da Sie mehr Funktionalität benötigen.

+1

Danke für die Info! Ich habe sehr wenig Dokumentation über NSCells gefunden. –

+3

Wenn Sie eine benutzerdefinierte Zelle mit Instanzvariablen entwerfen, lesen Sie die Dokumentation sorgfältig, da einige Methoden wie "copyWithZone:" implementiert werden müssen. –

+0

Also muss ich '-setObjectValue:' in meiner benutzerdefinierten NSCell-Unterklasse implementieren und gebe einfach den Objektwert für die rechte Zelle in '-tableView: objectValueForTableColumn: row: '? – 11684

3

Eine Zelle kann immer nur einen Objektwert enthalten. Erstellen Sie ein Modellobjekt mit den Attributen image und string/attribute und füllen Sie die Tabellenansicht damit.

Auch ein Textfeld ist eine Ansicht. Ihr Modell sollte nichts von seiner Präsentation wissen - das ist die Aufgabe Ihrer Ansichten.

Verwandte Themen