NSOutlineView通过NSArrayController进行绑定

时间:2011-12-14 19:35:06

标签: macos cocoa interface-builder nsoutlineview

我有一个应用程序播放带有这样结构的歌曲(曲目)([]括号代表'列表'):

    SidebarController (NSObject)
      SidebarContentController (NSArrayController)
            [
                ListController (NSArrayController)
                    [
                        TrackModel (NSObject)
                    ]
            ]

我在InterfaceBuilder中使用绑定。只要我有这个结构一切都很好,我能够将NSTableView的内容绑定到SidebarController:self.sidebarContentController.selection.arrangedObjects

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

    SidebarController (NSObject)
      SidebarContentController (NSArrayController)
            [
                ListController (NSTreeController)
                    [
                        PlaylistModel (NSObject)
                            [
                                TrackModel (NSObject)
                            ]               
                    ]
            ]

但现在我无法绑定NSOutlineView self.sidebarContentController.selection.arrangedObjects因为当我启动应用程序时,我得到一个例外:

    *** -[NSProxy doesNotRecognizeSelector:_mutatingNodes] called!

当我尝试一个简单的结构时,它很有效:

    ListController (NSTreeController)
        [
            PlaylistModel (NSObject)
                [
                    TrackModel (NSObject)
                ]               
        ]

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

任何想法出了什么问题?这是应用程序的屏幕截图,因此您了解我需要SidebarContentController的原因:

Screenshot with sidebar

我需要NSTableView成为NSOutlineView才能显示树结构。

1 个答案:

答案 0 :(得分:1)

我相信你的问题的根源是在基本上你的模型中使用控制器。正如结构图中所表达的那样,假设“list of”等同于一个数组,你有:

SidebarContent (NSArrayController)
    List (NSArrayController)[]
        Track (NSObject)[]

你应该有:

SidebarContent (NSArray)
    List (NSArray)[]
        Track (NSObject)[]

控制器对象将每个视图(两个tableview和一个自定义视图;因此两个NSArrayController,可能还有一个NSObjectController)绑定到模型中的相应内容(第二个NSArrayController的内容取决于第一个的选择)。

此时,您可以直观地向模型中添加另一个图层(List的播放列表?),用NSOutlineView替换第二个NSTableView,并用NSTreeController替换第二个NSArrayController。