Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Xamarin Studio中以编程方式创建NSView_C#_Macos_Cocoa_Mono_Xamarin - Fatal编程技术网

C# 在Xamarin Studio中以编程方式创建NSView

C# 在Xamarin Studio中以编程方式创建NSView,c#,macos,cocoa,mono,xamarin,C#,Macos,Cocoa,Mono,Xamarin,我正试图找到一个解决我先前提出的这个问题的方法: 我目前正在尝试实现NSOutlineViewDelegate的GetView方法,看看这是否会在我的OutlineView中创建一些文本 但我一直在尝试向NSView对象添加内容。当我查看示例OutlineView(将其拖到窗口上时默认得到的示例)时,每个项目都有一个TableCellView。结构如下所示(首先是标题,然后是常规项): 到目前为止,我的方法如下所示: public override NSView GetView (NSOutli

我正试图找到一个解决我先前提出的这个问题的方法:

我目前正在尝试实现
NSOutlineViewDelegate
GetView
方法,看看这是否会在我的OutlineView中创建一些文本

但我一直在尝试向NSView对象添加内容。当我查看示例OutlineView(将其拖到窗口上时默认得到的示例)时,每个项目都有一个
TableCellView
。结构如下所示(首先是标题,然后是常规项):

到目前为止,我的方法如下所示:

public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item)
{
    var navigation = item as Navigation;
    var cell = new NSTableCellView();

    if (navigation.IsHeader) {
    } else {
    }

    return cell;
}
public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item)
{
    if(IsGroupItem(outlineView, item))
    {
        return outlineView.MakeView("HeaderCell", this);
    }

    return outlineView.MakeView("DataCell", this);
}
我的第一个猜测是,例如,我创建了一个
NSTableHeaderCell
,并将
StringValue
属性设置为
navigation.Name
。但我不知道如何将其作为子项添加到我的
NSTableViewCell


还是我完全错了?我对Mono和Xamarin非常陌生(只使用WPF和XAML编写过C#和Visual Studio),而且我以前从未使用Objective-C编写过程序(因此我花了一段时间才弄清楚方法/类的奇怪语法)。

您将在XCode中看到,
表单元格视图
对象有一个可以设置的“标识符”。就我而言,我有“HeaderCell”和“DataCell”

我的代码如下所示:

public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item)
{
    var navigation = item as Navigation;
    var cell = new NSTableCellView();

    if (navigation.IsHeader) {
    } else {
    }

    return cell;
}
public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item)
{
    if(IsGroupItem(outlineView, item))
    {
        return outlineView.MakeView("HeaderCell", this);
    }

    return outlineView.MakeView("DataCell", this);
}
这将创建在XCode中定义的
TableCellView
的适当实例

在我的例子中,我使用Cocoa绑定而不是数据源,因此我的视图会自动填充数据。这可能是您想要研究的一种方法,因为它更接近WPF/XAML的数据绑定方式。然而,它有一个陡峭的学习曲线,并且很难调试(比如WPF/XAML数据绑定!)

您可以访问它的子视图并进行适当的设置,而不是简单地返回单元格。比如:

var dataView = outlineView.MakeView("DataCell", this);
((NSImageView)dataView.Subviews[0]).Image = // assign an image
((NSTextField)dataView.Subviews[1]).StringValue = // assign your text
return dataView;

(注意:我只是从头顶上键入了这一点,它可能无法按原样工作-但希望您能理解)

当用户编辑了某个项目文本字段的字符串值时,此覆盖或其他覆盖是否能够检测到?@salgarcia请看下面的问题: