(Фон: у меня есть приложение Cocoa, которое я пишу, это прекрасно работает, но слишком сложно, потому что у него нет хорошего разделения модели/представления/контроллера. Поэтому я обновляю его, чтобы использовать NSDocument и NSWindowController/NSViewController. В целом, это хорошее изменение, но есть некоторые части, которые я пока не совсем понимаю.)Какой стандартный способ NSDocument отправлять события NSViewControllers?
У меня есть NSDocument, который содержит состояние документа, и иерархию NSWindowController -> NSViewControllers, которые управляют логикой. Когда контроллер просмотра реагирует на ввод пользователя и ему нужно изменить какое-либо состояние, он может легко получить свой NSDocument и вызвать на нем метод, чтобы внести запрошенное изменение (которое также зарегистрирует его с помощью undoManager и т. Д.). Это направление отлично работает.
Но другое направление менее ясно. Когда NSDocument вносит изменения (возможно, в прямой реакции на редактирование пользователя, но, возможно, нет), как обычно он отправляет событие вниз контроллерам представления для обновления представлений?
В документации Apple я вижу несколько удобных diagrams here, но мне непонятно, что они пытаются показать. Оранжевая стрелка определяется как «Владеет и управляет», но никогда не говорит о том, что означает стрелка с пунктиром, стрелка с двойным концом или двуглавая стрелка.
Являются ли они предполагающими, что приложения обычно имеют все типы изменений состояния, представленные методами в их NSWindowController, который передает их соответствующим методам в дерево NSViewController? Это кажется довольно неуклюжим.
Прямо сейчас, я склоняюсь к тому, что NSNocument публикует NSNotifications для всех изменений, а затем позволяет NSViewControllers регистрировать именно те уведомления, о которых они заботятся. Это кажется менее неуклюжим, но, возможно, еще не идеальным.
EDIT: Или KVO? Пример Apple немного использует KVO, но он также имеет гораздо более простую модель данных. Я не уверен, что это сработает для меня, и это также похоже на то, что не полностью соответствует тому, куда движется Swift. Я не хочу прыгать на то, что не имеет хорошего будущего.
Пожалуйста, добавьте связанную часть кода в ответ вместо внешней ссылки. – Arashsoft
Arashsoft: Ответ по существу: «Да, это разумный образец». Ссылка github просто свидетельствует о том, что хотя бы одна программа была написана в этом стиле и сама по себе не является ответом. На самом деле сам вопрос описывает этот шаблон. Я не вижу смысла копировать пример здесь, который использует устаревшие имена API и устаревший синтаксис языка и не имеет смысла без контекста остальной части его программы. – WhatsUpNSDoc