Архитектура контроллера NS (Array | Tree) для нескольких контроллеров NSView - PullRequest
5 голосов
/ 03 июня 2009

У меня есть приложение Core Data без документов. Существует NSTreeController, который управляет коллекцией объектов, отображаемых в одном NSOutlineView в виде списка источников. Это обычные вещи: заголовки, папки, умные папки и т. Д.

Каждый из этих объектов-контейнеров имеет коллекцию contents объектов. У меня есть три отдельных контроллера представления, которые отображают эти объекты различными способами (NSTableView и два пользовательских графических представления, если вы действительно хотите это знать). Но на самом деле это всего лишь три разных представления одних и тех же данных. Они должны всегда показывать одни и те же объекты, иметь одинаковый выбор и т. Д.

Я также использую иерархию NSViewController s для управления своими представлениями. (Если бы я знал о превосходных KTUIKit Кэти Шиве в то время, я бы использовал это, но мои контроллеры вида очень похожи - и очень вдохновлены - ее)

В нынешнем виде у меня есть NSTreeController, живущий в контроллере вида для списка источников. У меня также есть NSArrayController в каждом из контроллеров подвидов, который связан с NSTreeController через несколько чрезмерно сложных путей к ключам.

Итак, что нужно изменить, на мой взгляд, это следующее:

  • NSTreeController необходимо выйти из контроллера вида структуры.
  • Должен быть один NSArrayController, к которому может быть привязан каждый из представлений содержимого вместо трех отдельных. Хотя я менее уверен в этом.

У меня возникли трудности с выяснением , где эти вещи должны жить. Мне трудно решить, какие объекты, если таковые имеются, действительно «владеют» различными контроллерами. Родительские контроллеры представления владеют этим? Есть ли у окна контроллер? Поскольку это данные уровня приложения, могу ли я зайти так далеко, чтобы сделать их принадлежащими делегату приложения? (Я могу представить себе ситуацию, когда пользователь может захотеть открыть несколько окон, хотя в настоящее время это не поддерживается). Что думает улей StackOverflow?

1 Ответ

2 голосов
/ 03 июня 2009

NSArrayController и NSTreeController обрабатываются скорее как объекты просмотра, чем как настоящие контроллеры, поэтому звучит так, будто вы на правильном пути. Я бы начал примерно так же, как вы, предоставив каждому NSViewController свой собственный NSArrayController или NSTreeController по мере необходимости и настроив привязки между ними во время выполнения через оконный контроллер, который отвечает за сборку всех частей.

Если вы думаете, что это упростит вещи, не похоже, что было бы что-то не так с перемещением объектов NSArrayController и NSTreeController в оконный контроллер. Вы все еще можете установить привязки к представляемому объекту контроллера представления в IB, а затем создать соответствующие контроллеры массива / дерева в коде в вашем оконном контроллере в соответствующее время. Просто будьте осторожны, чтобы не усложнить здесь. Я обнаружил, что, когда у вас в одном окне много контроллеров представления, использующих для разных целей представленный объект, проще создавать отдельные типизированные свойства, чтобы вы могли понять, куда и куда идут детали.

Я не совсем понимаю преимущества создания контроллеров массива / дерева в составе делегата приложения, но я мало что знаю о том, что вы там делаете. Может быть, вы выиграете от создания своего собственного объекта «контроллер данных»?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...