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
- (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)
实际上,您不需要设置委托.这是我如何使它工作(测试NSTreeController,但也应该使用NSArrayController):
arrangedObjects(没有模型键路径)objectValue.yourCustomValueTableCellView.确保两个标识符相同.对具有不同标识符的其余列重复此操作.正如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)