将基于视图的NSOutlineView绑定到核心数据

Dov*_*Dov 16 macos cocoa nsoutlineview nstableview osx-lion

我正在尝试在我的Mac应用程序中将新的基于视图的OutlineView实现为源列表.但是,我无法显示值,因此我从Core Data应用程序模板中制作了一个小型测试应用程序,并且无法在其中使用它.

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

我将源列表从对象库拖到我的XIB上,然后放入树控制器中.树控制器的键路径设置为"子",它处于实体名称模式,"父"作为实体名称,准备内容选中,其管理对象上下文设置为应用程序委托的上下文.树控制器是大纲视图的数据源,我使用"objectValue.name"键路径将数据单元的文本视图绑定到表格单元视图.

-applicationDidFinishLaunching:我创建两个实例,一个与,并分配每个对象的名称属性.

实际问题

没有文字

现在,通过该设置,我会在源列表中显示行,但文本字段为空,即使它们已被绑定.我不认为我应该做任何其他事情,因为我正在使用绑定,而且我相当肯定绑定到objectValue属性是正确的.出了什么问题?

如果有必要,我可以提供更多细节,但我很确定这涵盖了我所做的一切.

Boa*_*ler 25

哇,就像我两周前的问题一样.

无论如何,如果你像我一样,问题是,
对于基于视图NSOutlineViews,你需要实现

- (NSView *)outlineView:(NSOutlineView *)outlineView
     viewForTableColumn:(NSTableColumn *)tableColumn
                   item:(id)item;
Run Code Online (Sandbox Code Playgroud)

委托方法并返回NSTableCellView你设置的,
或者他们只会给你一个空白行.最简单的方法就是打电话

[outlineView makeViewWithIdentifier:@"MyCell" owner:self]
Run Code Online (Sandbox Code Playgroud)

替换 为您在身份检查器中MyCell输入的任何内容作为"用户界面项标识符" .
NSTableCellView

Objective-C的:

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
   return [outlineView makeViewWithIdentifier:@"MyCell" owner:self];
}
Run Code Online (Sandbox Code Playgroud)

迅速:

func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
    return outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier("MyCell"), owner: self)
}
Run Code Online (Sandbox Code Playgroud)

更新2018-08-02:

实际上,您不需要设置委托.这是我如何使它工作(测试NSTreeController,但也应该使用NSArrayController):

  • 将每个列对象绑定到arrangedObjects(没有模型键路径)
  • 将最内部的自定义视图(例如,标签字段)绑定到 objectValue.yourCustomValue
  • 不应该是必要但如果这不起作用,请尝试设置列的标识符和TableCellView.确保两个标识符相同.对具有不同标识符的其余列重复此操作.

屏幕截图:基于视图的NSOutlineView的绑定

  • 除了使用绑定之外,您还需要实现此功能.绑定仍然可以处理设置单元视图的objectValue,以及将单元视图的子视图绑定到该objectValue.但是仍然需要此方法来告诉大纲视图用于特定行/列的单元视图. (6认同)
  • 这是必要的,因为源列表默认情况下在同一列中使用两个不同的单元格,HeaderCell和DataCell,并且它不能为您选择一个,如果您只有一个单元格并且其标识符设置为自动,则可能. (6认同)

Rya*_*yan 6

正如Boaz上面提到的,您需要实现Delegate方法来返回视图.

考虑到我在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;
}
Run Code Online (Sandbox Code Playgroud)