Macos 大Sur大纲视图可扩展项已损坏

Macos 大Sur大纲视图可扩展项已损坏,macos,appkit,nsoutlineview,macos-big-sur,Macos,Appkit,Nsoutlineview,Macos Big Sur,我启动了一个新的macOS项目(目前在Big Sur beta 3上),而NSOutlineView节点似乎已损坏。不知道这是我还是操作系统 这说明了问题所在。还有一个图像 如您所见,单元与展开V形重叠。单击任一V形可将第一行恢复为正确的布局,但不会将第二行恢复为正确的布局。此外,永远不会调用自动保存方法persistentObjectForItem和itemForPersistentObject 测试项目非常简单——我所做的只是将视图库中的SourceView组件添加到默认的应用程序项目中,

我启动了一个新的macOS项目(目前在Big Sur beta 3上),而
NSOutlineView
节点似乎已损坏。不知道这是我还是操作系统

这说明了问题所在。还有一个图像

如您所见,单元与展开V形重叠。单击任一V形可将第一行恢复为正确的布局,但不会将第二行恢复为正确的布局。此外,永远不会调用自动保存方法
persistentObjectForItem
itemForPersistentObject

测试项目非常简单——我所做的只是将视图库中的
SourceView
组件添加到默认的应用程序项目中,并将委托/数据源连接到视图控制器。还选中了IB中的
自动保存扩展项
,并在
自动保存
字段中输入一个名称。以下是控制器代码的全部内容:

类ViewController:NSViewController{
@IBVar outlineView:NSOutlineView?
让数据=[节点(“第一项”,1),节点(“第二项”,2)]
}
扩展视图控制器:NSOutlineViewDataSource{
func outlineView(outlineView:NSOutlineView,子索引:Int,of item项:Any?)->Any{
数据[索引]
}
func大纲视图(outlineView:NSOutlineView,isItemExpandable item:Any)->Bool{
真的
}
func outlineView(outlineView:NSOutlineView,numberOfChildrenOfItem:Any?)->Int{
item==nil?数据。计数:0
}
func outlineView(outlineView:NSOutlineView,tableColumn:NSTableColumn?的objectValueFor,byItem item:Any?)->Any{
项目
}
func outlineView(outlineView:NSOutlineView,PersistentObject for item item:Any?->Any{
(项目作为?节点)?.id
}
func outlineView(outlineView:NSOutlineView,itemForPersistentObject对象:任意)->任意{
guard let id=对象为?Int else{return nil}
返回data.first{$0.id==id}
}
}
扩展视图控制器:NSOutlineViewDeleteGate{
func outlineView(outlineView:NSOutlineView,viewFor tableColumn:NSTableColumn?,项目:任意)->NSView{
guard let node=项目作为?节点else{
预处理失败(“无效数据项\(项)”)
}
让view=outlineView.makeView(标识符:nodeCellIdentifier,所有者:self)作为?NSTableCellView
查看?.textField?.stringValue=node.name
view?.imageView?.image=NSImage(系统符号名称:node.icon,可访问性说明:nil)
返回视图
}
}
最终类节点{
让id:Int
let name:String
让图标:字符串
init(\uname:String,\uid:Int,\uicon:String=“folder”){
self.id=id
self.name=名称
self.icon=图标
}
}
私有let nodeCelliIdentifier=NSUserInterfaceItemIdentifier(“数据单元”)
有没有其他Mac开发人员可以提供帮助?

源代码列表 什么是源列表?它是(它是 )带着特殊的 治疗。Finder屏幕截图:

要创建源列表,只需设置 财产 . 文件说:

NSTableView的源列表样式。在10.5中,浅蓝色渐变用于高亮显示选定行

它到底做什么?跳转到Xcode中的定义并阅读注释(不包括在文档中):

NSTableView的源列表样式。在10.10及更高版本上,模糊选择用于高亮显示行。在此之前,使用了浅蓝色渐变。注意:具有drawsBackground属性的单元格应将其设置为“否”。否则,它们将绘制在NSTableView所做的高亮显示上。设置此样式的副作用是将背景色设置为“源列表”背景色。此外,在NSOutlineView中,将更改以下属性以获得标准的“源列表”外观:indentationPerLevel、rowHeight和intercellSpacing。调用setSelectionHighlightStyle后:可以根据需要更改任何其他属性。在10.11中,如果背景颜色已从“源列表”背景颜色更改为其他颜色,则表格将不再将所选内容绘制为源列表模糊样式,而是进行普通的蓝色高亮显示

由于您在Big Sur,请注意,
SelectionHighlightStyle.sourceList
已被弃用。 应该使用 &

样本项目 Xcode:

  • 新项目
    • macOS和应用程序(故事板和应用程序套件应用程序代表和Swift)
  • 主故事板
    • 添加源列表控件
      • 定位和固定约束
      • 将委托和数据源设置为ViewController
      • 启用自动保存扩展项
      • 将Autosave设置为您想要的任何设置(我有
        FinderLikeSidebar
        在那里)
        • 明智地选择,因为扩展状态保存在用户默认值中 在
          NSOutlineView Items FinderLikeSidebar
          键下
      • 创建
        @IBOutlet var-outlineView:NSOutlineView
    • 添加另一个文本表格单元格视图(无图像)
      • 将标识符设置为
        GroupCell
  • ViewController.swift
    • 下面是注释代码
截图

正如你所看到的,它几乎像查找器一样-第二级仍然缩进。原因 因为文档节点是可扩展的(有子节点)。我让他们在这里演示自动保存

如果要将所有第二级节点向左移动,只需删除它们

ViewController.swift代码 除了阅读评论之外,没什么可说的了:)

导入可可粉
//包含组和常规项的示例节点类
类节点{
让id:Int
标题:字符串
让symbolName:字符串?
让子节点:[节点]
让我们分组:Bool
init(id:Int,title:String,symbolName:String?=nil,children:[Node]=[],isGroup:Bool=false){
self.id=id