macos - 通过 NSArrayController 绑定(bind) NSOutlineView

标签 macos cocoa interface-builder nsoutlineview

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

    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:

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/

相关文章:

在许多机器上进行 iPhone 开发

objective-c - 如何在cocoa(Interface Builder)中绑定(bind)CGSize.width?

ios - 在 Xcode 的 Interface Builder 中,如何相对于彼此而不是 super View 自动调整大小/空间控件

ios - 对 iOS 5 NIB 使用 iOS 6 字体

macos - React Native macOS 菜单栏应用程序可以吗?

xcode - Mac OS X : How to launch an application (. 应用程序)来自 "Command Line Tool"类型的应用程序?

cocoa - 在使用 Core Data 和推出自定义模型之间做出决定的因素有哪些?

iphone - 最佳方法 : Read And Understand Unknown Xcode Projects

iphone - 当按下第三个数字键时,简单的计算器应用程序崩溃

objective-c - NSToolbarItem 子类上的 IBOutlet 导致图像消失并且交互被禁用