我有一个应用程序,可以播放具有如下结构的歌曲(轨道)([] 括号代表“列表”):
SidebarController (NSObject)
SidebarContentController (NSArrayController)
[
ListController (NSArrayController)
[
TrackModel (NSObject)
]
]
我正在 InterfaceBuilder 中使用绑定(bind)。只要我有这个结构,一切都很好,我可以使用以下命令将 NSTableView 的内容绑定(bind)到 SidebarController: self.sidebarContentController.selection.arrangedObjects
现在我想改用 NSOutlineView,因为我想显示用户可以打开和播放的播放列表。所以结构现在看起来像这样:
SidebarController (NSObject)
SidebarContentController (NSArrayController)
[
ListController (NSTreeController)
[
PlaylistModel (NSObject)
[
TrackModel (NSObject)
]
]
]
但现在我无法绑定(bind) NSOutlineView
self.sidebarContentController.selection.arrangedObjects
因为当我启动应用程序时出现异常:
*** -[NSProxy doesNotRecognizeSelector:_mutatingNodes] called!
当我尝试像这样的简单结构时,效果很好:
ListController (NSTreeController)
[
PlaylistModel (NSObject)
[
TrackModel (NSObject)
]
]
然后我可以将它与 ListController 上的 self.arrangedObjects 绑定(bind),并且 NSOutlineView 显示所有播放列表和轨道。但我确实需要 SidebarContentController,因为我不仅有一个播放列表列表,而且有多个。
有什么想法出了什么问题吗?这是应用程序的屏幕截图,以便您了解为什么我需要 SidebarContentController:
我需要将 NSTableView 变成 NSOutlineView 才能显示树结构。
最佳答案
我相信您问题的根源是在您的模型中使用了 Controller 。正如结构图中所表达的,假设“列表”等于一个数组,您有:
SidebarContent (NSArrayController)
List (NSArrayController)[]
Track (NSObject)[]
你应该在哪里:
SidebarContent (NSArray)
List (NSArray)[]
Track (NSObject)[]
Controller 对象将每个 View (两个 TableView 和一个自定义 View ;因此两个 NSArrayController,也许还有一个 NSObjectController)绑定(bind)到模型中的适当内容(第二个 NSArrayController 的内容取决于第一个 NSArrayController 的选择)。
此时,您可以想象向模型中添加另一个层(播放列表的列表?),用 NSOutlineView 替换第二个 NSTableView,并用 NSTreeController 替换第二个 NSArrayController。
关于macos - 通过 NSArrayController 绑定(bind) NSOutlineView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8510555/