Macos NSOutlineView通过NSArrayController查看绑定

Macos NSOutlineView通过NSArrayController查看绑定,macos,cocoa,interface-builder,nsoutlineview,Macos,Cocoa,Interface Builder,Nsoutlineview,我有一个应用程序,它可以播放这样一种结构的歌曲(曲目)([]括号表示“一个列表”): 我正在InterfaceBuilder中使用绑定。只要我有这样的结构,一切都很好,我就能够使用:self.sidebarContentController.selection.arrangedObjects 现在我想改用NSOutlineView,因为我想显示用户可以打开和播放的播放列表。所以现在的结构是这样的: SidebarController (NSObject) SidebarCon

我有一个应用程序,它可以播放这样一种结构的歌曲(曲目)([]括号表示“一个列表”):

我正在InterfaceBuilder中使用绑定。只要我有这样的结构,一切都很好,我就能够使用:
self.sidebarContentController.selection.arrangedObjects

现在我想改用NSOutlineView,因为我想显示用户可以打开和播放的播放列表。所以现在的结构是这样的:

    SidebarController (NSObject)
      SidebarContentController (NSArrayController)
            [
                ListController (NSTreeController)
                    [
                        PlaylistModel (NSObject)
                            [
                                TrackModel (NSObject)
                            ]               
                    ]
            ]
但现在我无法将NSN大纲视图与
self.sidebarContentController.selection.arrangedObjects
因为启动应用程序时出现异常:

    *** -[NSProxy doesNotRecognizeSelector:_mutatingNodes] called!
当我尝试以下简单结构时,它工作得很好:

    ListController (NSTreeController)
        [
            PlaylistModel (NSObject)
                [
                    TrackModel (NSObject)
                ]               
        ]
然后我可以将它与ListController上的
self.arrangedObjects
绑定,NSOutlineView显示所有播放列表和曲目。但我真的需要SidebarContentController,因为我不仅有一个播放列表,还有几个

你知道怎么回事吗?以下是应用程序的屏幕截图,您可以了解我为什么需要SidebarContentController:


我需要NSTableView成为NSOutlineView,以便能够显示树状结构。

我认为问题的根源在于在本质上是您的模型中使用控制器。如结构图所示,假设“列表”等同于一个数组,则您有:

SidebarContent (NSArrayController)
    List (NSArrayController)[]
        Track (NSObject)[]
相反,您应该:

SidebarContent (NSArray)
    List (NSArray)[]
        Track (NSObject)[]
控制器对象将每个视图(两个TableView和一个自定义视图;因此,两个NSArrayController和一个NSObjectController)绑定到模型中的适当内容(第二个NSArrayController的内容取决于第一个视图的选择)


此时,您可以将另一层添加到模型中(播放列表列表?),用NSOutlineView替换第二个NSTableView,并用NSTreeController替换第二个NSArrayController。

啊,好的,我想我开始理解了。我将努力实施这一办法。
SidebarContent (NSArray)
    List (NSArray)[]
        Track (NSObject)[]