应该如何布置NSTableCellViews?

Sör*_*lau 9 xib nstextfield monomac xamarin-studio xcode5

我有一个相当基本MainWindow.xib的源列表样式侧边栏.我通过将源列表模板拖到窗口中来创建它,窗口已经包含两个NSTableCellViews:HeaderCellDataCell.

后者由图标(使用NSImageView)和标签(NSTextField)组成.相反,我想要标签和另一个较小的标签.在IB中,这看起来如下:

根据IB的来源清单

如果我专注于公正DataCell,它会相应地突出显示:

DataCell突出显示

事实上,实际运行程序,它看起来不像模板:

选择实时DataCell中的第二项

请注意两者如何NSTextField一起被粉碎成一个.我的理解是,基于视图的NSOutlineViews(以及基于视图的NSTableViews)应该被设计为IB内的模板.相反,模板中的维度似乎大多被忽略了.

以下是从数据源设置视图值的代码:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过覆盖GetRowHeight,但似乎没有解决问题(它腾出更多空间,但仍然不让视图正确分配),也没有必要.

我也试着与各种打Autosizing,Autoresizes Subviews等在IB切换,但这似乎并没有产生直观的效果,并再次,它似乎没有必要-在IB提出的观点是我想要的东西,只是在实践中使用稍长的标签.

我还没有尝试将其转换为AutoLayout.

我错过了哪一个明显的步骤?

一些可能没有区别的信息:这是一个Xamarin.Mac/MonoMac项目,包括Xcode 5.0,MacOSX10.8.sdk,Xamarin Studio 4.0.12,Xamarin.Mac 4.0.12和Mono 3.2.3(定位Mono/.NET 4.0).我还启用了App Sandboxing.

Pie*_*ton 1

在界面构建器中重要的是视图层次结构。该单元格是什么样的视图?这些标签真的是单元视图的子视图吗?层次结构应该类似于:

NSOutlineView 单元格层次结构示例

我认为可疑的一件事是访问dataView.Subviews[0][1]。如果您要向单元格添加子视图,那么应该创建您自己的NSTableViewCell子类,每个视图都连接到子类的IBOutlet属性。子类在其实现中不需要任何代码,只需在 中声明其属性@interface,例如titleFielddescriptionField,以及一个@implementation自动合成它们的空值。

然后makeViewWithIdentifier(或者显然是 Xamarin 中的粘合剂MakeView)在传递正确的标识符时应该创建您的子类,并且在运行时您可以在调试器中NSTableViewCell验证使用。po dataView然后,您可以使用子类接口的属性来访问子视图,而不是使用和NSTableViewCell来假设哪个视图位于子视图数组的哪个位置。dataView.titleFielddataView.descriptionField

如果您的单元格视图有一个文本字段,那么您可以NSTableViewCell在不进行子类化的情况下使用,但请连接textField插座(只要您不删除并重新创建单元格视图的标签视图,默认情况下它就会连接),以便您可以通过属性访问它,再次不必深入到子视图数组中。

话虽如此,我们并不清楚为什么你会看到自己的样子。看起来这些不是您期望的子视图,甚至可能看起来像是错误的字体以及错误的位置。使用 的自定义子类NSTableViewCell并在运行时验证其类是确保它创建您期望的视图的好方法,但您也可以使用po [dataView _subtreeDescription].