我正在尝试在Mac应用中将新的基于视图的OutlineView实现为源列表。但是我无法显示值,所以我从Core Data应用程序模板中制作了一个小型测试应用程序,并且无法使其正常工作。
我在数据模型中定义了两个简单的类;让我们称他们为“父母”和“孩子”。 父有一个属性,“名称”和一个关系,“孩子”。 名称是可选字符串,儿童是与儿童的可选多对多关系。 儿童具有相同的“名称”属性和与儿童相反的一对一“父”关系。我为这两个人生成了自定义类,并在孩子中为孩子写了一个返回nil
的存根。
我将源列表从对象库拖到我的XIB上,然后放入树控制器中。树控制器的子项键路径设置为“子”,它处于实体名称模式,“父”作为实体名称,准备内容选中,其托管对象上下文设置为应用程序委托的上下文。树控制器是大纲视图的数据源,我使用“objectValue.name”键路径将数据单元的文本视图绑定到表格单元视图。
在-applicationDidFinishLaunching:
中我创建了两个 Parent 实例,一个带有 Child ,并为每个对象分配 name 属性。
实际问题
现在,通过该设置,我会在源列表中显示行,但文本字段为空,即使它们已被绑定。我不认为我应该做任何其他事情,因为我正在使用绑定,而且我相当肯定绑定到objectValue
属性是正确的。出了什么问题?
如果有必要,我可以提供更多细节,但我很确定这涵盖了我所做的一切。
答案 0 :(得分:25)
无论如何,如果你像我一样,问题是,
对于基于视图的NSOutlineViews
,您需要实现
- (NSView *)outlineView:(NSOutlineView *)outlineView
viewForTableColumn:(NSTableColumn *)tableColumn
item:(id)item;
委托方法并返回您设置的NSTableCellView
,
或者他们只会给你一个空白行。最简单的方法是拨打
[outlineView makeViewWithIdentifier:@"MyCell" owner:self]
将您输入的内容替换为MyCell
作为“用户界面项标识符”
在NSTableCellView
的身份检查器中。
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
return [outlineView makeViewWithIdentifier:@"MyCell" owner:self];
}
func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
return outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier("MyCell"), owner: self)
}
实际上,您不需要设置委托。以下是我如何使用它(使用NSTreeController
进行测试,但也应该使用NSArrayController
):
arrangedObjects
(没有模型密钥路径)objectValue.yourCustomValue
TableCellView
。确保两个标识符相同。对具有不同标识符的其余列重复此操作。答案 1 :(得分:6)
正如Boaz上面提到的,你需要实现Delegate方法来返回一个视图。
考虑到我在文档中找不到该方法,这是一个谜。
关于(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;
}
答案 2 :(得分:4)
这似乎是Xcode 4或其左右的变化。接口构建器在NSOutlineView下添加两个NSTableCellView对象。如果删除NSTableCellView对象,则返回到您需要实现方法的更安全(或至少记录)的世界:
outlineView:dataCellForTableColumn:item
outlineView:willDisplayCell:forTableColumn:item
...或者至少你想做一个源列表。在任何情况下,这都是SourceView示例的设置方式,也就是为什么当您尝试重新创建可以在如此混乱中获取的SourceView示例时。
或者,如果您想继续使用NSTableCellView对象(非常有用),那么您可以:
将NSOutlineView'Content'绑定到TreeController.arrangedObjects
将NSTableCellView下的NSTextField(和/或NSImageView)与objectValue的模型关键路径绑定到“表格单元视图”。键>
答案 3 :(得分:1)
我创建了一个小样本项目,其中popuplates也会弹出一个NSOutlineView
,而不是CoreData,但关键因素是@ boaz-stuller声明选择了正确的单元格(类似于你处理的方式{{ 1}}在iOS中。
所以在my case我实现了这样的方法:
UITableViewCell
在github上查看besi/mac-quickies。 大部分内容可以在IB中完成,也可以在AppDelegate
中找到