2011-08-17 60 views
16

我试图在我的Mac应用程序中将新的基于视图的OutlineView作为源列表实现。尽管如此,我无法获取要显示的值,因此我从Core Data应用程序模板创建了一个小测试应用程序,但无法正常工作。将基于视图的NSOutlineView绑定到核心数据

我在我的数据模型中定义了两个简单的类;我们称他们为“父母”和“孩子”。 有一个属性,“名称”,和一个单一的关系,“儿童”。 是一个可选的字符串,并孩子是一个可选的一对多关系儿童孩子具有相同的“名称”属性和一对一的“父母”关系,该关系与儿童相反。我生成自定义类的这两个,并在写了一存根儿童儿童返回nil

我从对象库拖了节目源到我的厦门国际银行,并在树控制器下降。树控制器的子项关键路径设置为“子”,它处于实体名称模式,其中“父”作为实体名称,检查了准备内容,并将其托管对象上下文设置为应用程序委托的上下文。树控制器是大纲视图的数据源,我使用“objectValue.name”键路径将数据单元的文本视图绑定到表单元视图。

-applicationDidFinishLaunching:

我创建了两个家长情况下,一个具有儿童,并指定每个对象的财产。

实际问题现在

No text

,与设置的出路,我得到行显示源列表中,但文本字段为空,即使它们是界。我认为我不需要做其他任何事情,因为我使用绑定,并且我相当确定绑定到objectValue属性是正确的。出了什么问题?

如果必要的话,我可以提供更多的细节,但我敢肯定,涵盖一切我做到了。

+0

发现你得到这个工作?我有同样的问题,所以我试图复制你的项目。但我正在使用基于文档的应用程序。我的代理方法从来没有被调用过,我的单元格中没有任何文本值。但是,他们确实包含正确的数据。 D你有任何工作代码我可以看看?将不胜感激!我可以将我的测试项目上传到github。 – Mikael

+1

您是否将视图控制器标记为委托人?如果代理方法根本没有被调用,那么你的接线可能是不正确的。如果这不能解决你的问题,你应该发表你自己的问题。 – Dov

+0

不能相信我错过了。非常感谢! – Mikael

回答

23

哇,这就像我从两个星期前就问这个问题。

无论如何,如果你喜欢我什么,问题是,
收视基于NSOutlineViews,你需要实现

- (NSView *)outlineView:(NSOutlineView *)outlineView 
    viewForTableColumn:(NSTableColumn *)tableColumn 
        item:(id)item; 

委托方法并返回NSTableCellView您设置,
或者他们只会给你一个空白的行。要做到这一点最简单的方法是只叫

[outlineView makeViewWithIdentifier:@"MyCell" owner:self] 

与你键入的任何作为“用户接口项目标识”
的身份检查您NSTableCellView更换MyCell

+0

你的回答虽然看起来正确,但并不使用绑定。 – Richard

+6

除了使用绑定之外,还需要实现此功能。绑定仍然可以处理设置单元格视图的objectValue,并将单元格视图的子视图绑定到该objectValue。但是这个方法仍然需要告诉大纲视图用于特定行/列的单元视图。 –

+6

这是必要的,因为源列表在默认情况下在同一列中使用两个不同的单元格HeaderCell和DataCell,并且它不能为您选择一个单元格,如果您只有一个单元格并将其标识符设置为自动。 – Dov

5

正如Boaz指出的,你需要实现委托方法来返回一个视图。考虑到我无法在Docs中找到该方法,这是一个谜。 关于(id)item参数的类型,它是一个NSTreeControllerTreeNode,它是NSTreeNode的一个未记录的子类。如果您投射它,您可以获取单元格的对象,并根据什么类型的对象或该对象的任何属性确定单元格视图类型返回不同的视图。例如

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
NSTableCellView *view = nil; 

NSTreeNode *node = item; 

if ([node.representedObject isKindOfClass:[Group class]]) { 
    view = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
} else { 
    view = [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
} 
return view; 
} 
4

这似乎是对Xcode 4或其附件的更改。接口构建器在NSOutlineView下添加两个NSTableCellView对象。如果删除NSTableCellView对象返回到一个理智的,你需要将实现 outlineView(或至少证明)世界:dataCellForTableColumn:项目和outlineView:willDisplayCell:forTableColumn:项目

...或者至少你做,如果你需要一个源列表的样子。在任何情况下,这都是SourceView示例的设置方式,因此当您尝试重新创建SourceView示例时,您可能会陷入如此混乱。

另外,如果你想继续使用NSTableCellView对象(这是非常有用的),那么你可以:

  • 绑定的NSOutlineView“内容”到你的TreeController.arrangedObjects

  • 绑定NSTextField(和/或NSImageView)在NSTableCellView下与'Table Cell View'一起使用objectValue的模型键路径。 <键>

0

我创建了popuplates也popuplates的NSOutlineView,不与CoreData,但关键因素是,像@波阿斯 - stuller指出,正确的单元格选择(类似于你怎么一点示例项目在iOS的处理UITableViewCell小号

所以在my case我制定的方法,像这样:。在github

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 

    if ([self isHeader:item]) { 
     return [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
    } else { 
     return [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
    } 
} 

退房besi/mac-quickies 大部分的东西在IB要么做,也可以在AppDelegate

screenshot