Привязки NSOutlineView через NSArrayController - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть приложение, которое воспроизводит песни (треки) с такой структурой (скобки [] представляют собой «список»):

    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)
                ]               
        ]

тогда я могу связать его с self.arrangedObjects на ListController, а NSOutlineView показывает все списки воспроизведения и дорожки. Но мне действительно нужен SidebarContentController, потому что у меня есть не один список плейлистов, а несколько.

Есть идеи, что не так? Вот скриншот приложения, чтобы вы понимали, зачем мне нужен SidebarContentController:

Screenshot with sidebar

Мне нужно, чтобы NSTableView стал NSOutlineView, чтобы иметь возможность отображать древовидную структуру.

1 Ответ

1 голос
/ 18 декабря 2011

Я считаю, что источником вашей проблемы является использование контроллеров в сущности вашей модели. Как выражено в ваших структурных диаграммах, и предполагая, что «список» равен массиву, вы получаете:

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

где вместо этого вы должны иметь:

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

с объектами контроллера, которые связывают каждое представление (два представления таблицы и пользовательское представление; таким образом, два NSArrayController и, возможно, NSObjectController) с соответствующим содержимым в вашей модели (содержимое второго NSArrayController в зависимости от выбора первого).

В этот момент вы можете визуализировать добавление еще одного слоя в вашу модель (List of of Playlist's?), Заменив NSOutlineView на второй NSTableView и заменив второй NSArrayController на NSTreeController.

...