【问题标题】:How are NSTableCellViews supposed to be laid out?NSTableCellViews 应该如何布局?
【发布时间】:2013-09-28 13:53:16
【问题描述】:

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

后者由一个图标(使用NSImageView)和一个标签(NSTextField)组成。相反,我想要标签和下面的另一个较小的标签。在 IB 中,如下所示:

如果我只关注DataCell,它会相应地突出显示:

问题是,实际运行程序,它看起来不像模板:

请注意两个NSTextFields 是如何组合在一起的。我的理解是基于视图的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;
        }
    }
}

我尝试过覆盖GetRowHeight,但这似乎并没有解决问题(它腾出了更多空间,但仍然不会让视图正确分布自己),也没有似乎有必要。

我也尝试过在 IB 中使用各种 AutosizingAutoresizes Subviews 等切换,但这似乎并没有产生直观的结果,而且似乎没有必要 - 视图为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)。我还启用了应用沙盒。

【问题讨论】:

    标签: xib nstextfield xcode5 monomac xamarin-studio


    【解决方案1】:

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

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

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

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

    说了这么多,还不清楚为什么你会看到你是什么。看起来那些不是您期望的子视图,甚至可能看起来像错误的字体以及错误的位置。使用NSTableViewCell 的自定义子类并在运行时验证其类是确保它创建您期望的视图的好方法,但您也可以使用po [dataView _subtreeDescription] 在调试器中转储子视图。

    【讨论】:

      猜你喜欢
      • 2016-11-18
      • 2011-11-18
      • 2014-05-27
      • 1970-01-01
      • 2014-06-07
      • 2012-01-25
      • 2017-03-30
      • 2022-10-13
      相关资源
      最近更新 更多