我有一个应用程序播放带有这样结构的歌曲(曲目)([]括号代表'列表'):
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的原因:
我需要NSTableView成为NSOutlineView才能显示树结构。
答案 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。