2013-09-23 11 views
9

Ich habe eine ziemlich einfache MainWindow.xib mit einer Source-List-Stil Sidebar. Ich habe es erstellt, indem ich die Vorlage der Quellliste in das Fenster gezogen habe, das bereits zwei NSTableCellView s enthält: HeaderCell und DataCell.Wie sollen NSTableCellViews angelegt werden?

Letztere besteht aus einem Symbol (mit NSImageView) und einem Etikett (NSTextField). Stattdessen möchte ich das Etikett und ein anderes, kleineres Etikett darunter. In IB, sieht das wie folgt aus:

Source list according to IB

Wenn ich nur DataCell konzentrieren, hebt es dementsprechend:

DataCell highlighted

Das Ding ist, tatsächlich das Programm läuft, ist es nichts, wie das aussieht Vorlage:

Second item in live DataCell selected

Beachten Sie, wie die beiden NSTextField nur zusammen zerschlagen werden. Mein Verständnis war, dass view-basierte NSOutlineView s (und View-basierte NSTableView s, für die Angelegenheit) sollen als Vorlage aus IB konzipiert werden. Stattdessen scheinen die Dimensionen aus der Vorlage größtenteils ignoriert zu werden.

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

public class TourSourceListDelegate : NSOutlineViewDelegate 
{ 
    public override bool IsGroupItem(NSOutlineView outlineView, MonoMac.Foundation.NSObject item) 
    { 
     return (item as TourSourceListDataSource.Item).IsHeader; 
    } 

    public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, MonoMac.Foundation.NSObject item) 
    { 
     if (IsGroupItem(outlineView, item)) 
     { 
      return outlineView.MakeView("HeaderCell", this); 
     } 
     else 
     { 
      var data = item as TourSourceListDataSource.Item; 
      var dataView = outlineView.MakeView("DataCell", this); 

      (dataView.Subviews[0] as NSTextField).StringValue = data.Name; 
      (dataView.Subviews[1] as NSTextField).StringValue = data.Date_start.ToShortDateString(); 

      return dataView; 
     } 
    } 
} 

Ich habe GetRowHeight versucht, überschreiben, aber das scheint nicht das Problem zu lösen (es macht mehr Raum, aber noch lässt die Ansichten sich nicht richtig verteilen), noch scheint es 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 produzieren, und wiederum scheint es nicht notwendig - die Ansicht wie in IB dargestellt 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.

Welchen offensichtlichen Schritt vermisse 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.

Antwort

1

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

example NSOutlineView cell hiearchy

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

Dann makeViewWithIdentifier (oder apprently den Leim MakeView in Xamarin), wenn die richtige Kennung übergeben sollte Ihre NSTableViewCell Unterklasse erstellen und zur Laufzeit können Sie überprüfen, ob po dataView im Debugger. Dann greifen Sie auf die Untersichten zu, indem Sie die Eigenschaften der Schnittstelle Ihrer Unterklasse NSTableViewCell verwenden, anstatt davon auszugehen, welche Ansicht sich an der Position mit dem Unteransichtsarray befindet. Verwenden Sie dazu und dataView.descriptionField.

Wenn Ihr Handy Ansicht, die ein Textfeld hat, dann können Sie NSTableViewCell ohne Subclassing verwenden, aber verbinden, um den textField Ausgang (das standardmäßig verbunden, solange Sie nicht & löschen neu die Beschriftung Ansicht der Zelle Ansicht), so dass Sie kann durch die Eigenschaft erneut darauf zugreifen, anstatt in das Subviews-Array eintauchen zu müssen.

Alles was gesagt wird, es ist nicht wirklich klar, warum Sie sehen, was Sie sind. 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 im Debugger mithilfe von po [dataView _subtreeDescription] ausgeben.

Verwandte Themen