2

(Фон: у меня есть приложение 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. Я не хочу прыгать на то, что не имеет хорошего будущего.

ответ

0

Все, что я читал, говорит, чтобы избежать KVO, и что KVO имеет худший API во всем Cocoa. Так что давайте просто пропустим это.

This old post on com.sys.mac.programmer.help говорит, что NotificationCenter является прекрасным решением:

мой предпочтение было размещать уведомление в моих сеттеров в модели и зарегистрировать свои контроллеры окна (или любой другой контроллер управления видом) получать эти уведомления

это удивительно трудно найти примеры программ, которые используют NSDocument, по какой-то причине, но here's a simple example программы, которая использует эту шаблон.

+0

Пожалуйста, добавьте связанную часть кода в ответ вместо внешней ссылки. – Arashsoft

+0

Arashsoft: Ответ по существу: «Да, это разумный образец». Ссылка github просто свидетельствует о том, что хотя бы одна программа была написана в этом стиле и сама по себе не является ответом. На самом деле сам вопрос описывает этот шаблон. Я не вижу смысла копировать пример здесь, который использует устаревшие имена API и устаревший синтаксис языка и не имеет смысла без контекста остальной части его программы. – WhatsUpNSDoc