Wie sollen NSTableCellViews angelegt werden?

9

Ich habe eine relativ einfache MainWindow.xib mit einer Sidebar im Source List-Stil. Ich habe es erstellt, indem ich die Vorlage Quellliste in das Fenster gezogen habe, das bereits zwei NSTableCellView s: HeaderCell und DataCell enthält.

Letzteres besteht aus einem Icon (mit NSImageView ) und einem Label ( NSTextField ). Stattdessen möchte ich das Etikett und ein anderes, kleineres Etikett darunter. In IB sieht das so aus:

Wenn ich mich auf DataCell konzentriere, wird das entsprechend hervorgehoben:

Tatsache ist, dass das Programm tatsächlich läuft, es sieht nicht wie die Vorlage aus:

Beachten Sie, wie die beiden NSTextField s in einem zusammengeschlagen werden. Mein Verständnis war, dass die Ansicht-basierte NSOutlineView s (und die Ansicht-basierte NSTableView s, für diese Angelegenheit) soll als eine Vorlage aus IB konzipiert werden. Stattdessen scheinen die Dimensionen aus der Vorlage größtenteils ignoriert zu werden.

Hier ist der Code, der die Werte der Ansicht aus der Datenquelle festlegt:

%Vor%

Ich habe versucht, GetRowHeight zu überschreiben, aber das scheint das Problem nicht zu lösen (es macht mehr Platz, aber noch lässt die Ansichten sich nicht richtig verteilen) und tut es auch nicht es scheint notwendig.

Ich habe auch versucht, mit den verschiedenen Autosizing , Autoresizes Subviews , usw. -Toggles in IB zu spielen, aber das scheint nicht zu intuitiven Ergebnissen zu führen, und wieder scheint es nicht notwendig - die Ansicht als präsentiert in IB ist genau das, was ich will, nur mit etwas längeren Etiketten in der Praxis.

Ich habe noch nicht versucht, dies in AutoLayout zu konvertieren.

Was für ein offensichtlicher Schritt fehle ich?

Einige weitere Informationen, die wahrscheinlich keinen Unterschied machen: Dies ist ein Xamarin.Mac / MonoMac-Projekt mit Xcode 5.0, MacOSX10.8.sdk, Xamarin Studio 4.0.12, Xamarin.Mac 4.0.12 und Mono 3.2 .3 (Ausrichtung auf Mono / .NET 4.0). Ich habe auch App Sandboxing aktiviert.

    
Sören Kuklau 23.09.2013, 15:27
quelle

1 Antwort

1

Was im Interface Builder wichtig ist, ist die View-Hierarchie. Was für eine Art von Sicht ist diese Zelle? Sind diese Labels wirklich Subviews der Zellansicht oder nicht? Die Hierarchie sollte etwa so aussehen:

Eine Sache, die mir gefällt, ist der Zugriff auf dataView.Subviews[0] und [1] . Wenn Sie Ihren Zellen Unteransichten hinzufügen, sollten Sie Ihre eigenen NSTableViewCell - Unterklassen erstellen, wobei jede Ansicht mit der Unterklasse ' IBOutlet properties' verbunden ist. Die Unterklasse benötigt in ihrer Implementierung keinen Code, nur die Deklaration ihrer Eigenschaften in @interface , wie titleField und descriptionField , und eine leere @implementation , die sie automatisch synthetisiert.

Dann makeViewWithIdentifier (oder apparelly die Leim MakeView in Xamarin), wenn die richtige Kennung übergeben sollte Ihre NSTableViewCell Unterklasse erstellen, und zur Laufzeit können Sie überprüfen, dass po dataView im Debugger. Dann greifen Sie über die Eigenschaften Ihrer Schnittstelle NSTableViewCell subclass auf die Untersichten zu, anstatt davon auszugehen, welche Ansicht in welcher Position mit dem Unteransichtsfeld ist, indem Sie dataView.titleField und dataView.descriptionField verwenden.

Wenn Ihre Zellenansicht ein Textfeld enthält, können Sie NSTableViewCell ohne Unterklasse verwenden, aber verbinden Sie die textField -Ausgabe (standardmäßig verbunden, solange Sie die Beschriftung der Zellenansicht nicht löschen und neu erstellen) Ansicht), damit Sie wieder über die Eigenschaft darauf zugreifen können, anstatt in das Subview-Array zu tauchen.

Alles was gesagt wird, es ist nicht wirklich klar, warum du siehst, was du bist. Es sieht so aus, als wären das nicht die Subviews, die Sie erwarten, und könnten sogar wie die falschen Fonts aussehen und auch an den falschen Stellen. Die Verwendung einer benutzerdefinierten Unterklasse von NSTableViewCell und die Überprüfung der Klasse zur Laufzeit stellen eine gute Möglichkeit dar, die erwartete Ansicht zu erstellen. Sie können die Unteransicht jedoch auch mit po [dataView _subtreeDescription] im Debugger sichern.

    
Pierre Houston 01.10.2013 04:12
quelle