(я оставляю предыдущий ответ на месте, потому что он отвечает на вопрос, когда его спрашивают о подклассе NSView, но теперь, когда оригинальный автор заявил, что он использует NSViewController, существуют другие соображения).
В случае NSViewController
-контролируемого представления NSViewController
предназначено для присоединения к его данным с помощью свойства representedObject
. Эта абстракция предназначена для управления контроллером, содержащим NSViewController, который звучит так, как будто вы NSWindowController
.
В зависимости от того, сколько инкапсуляции вы хотите / должны предоставить, вы можете либо отправить документ в NSViewControllers (если они работают со всем документом), либо передать только информацию из документа, относящуюся к конкретному NSViewController.
Например, я возьму часть программного обеспечения, которое редактирует информацию о конструкции поезда: двигатель, вагоны и камбуз. Подкласс NSDocument
содержит один объект двигателя, один объект камбуза и 0 или более объектов автомобиля. В этом случае у вас может быть 3 NSView
с, каждый со своим собственным NSViewController
для обработки движущихся данных в и из представлений их объектов.
NSWindowController обрабатывает установку representedObject
каждого *1017* объекта, который он понимает. Например, когда загрузка представлений завершится, контроллер окна будет:
[engineViewController setRepresentedObject: engine];
[cabooseViewController setRepresentedObject: caboose];
Затем вы можете использовать NSTableView для отображения списка автомобилей, и (при просмотре автомобиля) контроллер окна может использовать [carViewController setRepresentedObject: car];
при изменении выбора (или вы можете использовать привязки, в зависимости от как ваш код структурирован).
Таким образом, вы используете все преимущества парадигмы MVC, поскольку контроллеры связывают представления с моделями по мере необходимости, но структура документа действительно понятна только NSWindowController верхнего уровня.