gpt4 book ai didi

macos - 通过 NSArrayController 绑定(bind) NSOutlineView

转载 作者:行者123 更新时间:2023-12-03 17:59:36 26 4
gpt4 key购买 nike

我有一个应用程序,可以播放具有如下结构的歌曲(轨道)([] 括号代表“列表”):

    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) NSOutlineViewself.sidebarContentController.selection.arrangedObjects 因为当我启动应用程序时出现异常:

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

当我尝试像这样的简单结构时,效果很好:

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

然后我可以将它与 ListController 上的 self.arrangedObjects 绑定(bind),并且 NSOutlineView 显示所有播放列表和轨道。但我确实需要 SidebarContentController,因为我不仅有一个播放列表列表,而且有多个。

有什么想法出了什么问题吗?这是应用程序的屏幕截图,以便您了解为什么我需要 SidebarContentController:

Screenshot with sidebar

我需要将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com