Совместное использование подкласса NSDocument между несколькими NSWindowControllers

#objective-c #cocoa #nsdocument

#objective-c #cocoa #nsdocument

Вопрос:

У меня есть приложение, которое в настоящее время не является приложением на основе документов (потому что я думал, что это доставит больше проблем, чем оно того стоит). Однако я думал, что, возможно, это того стоит, но есть одна проблема, которую я еще не решил. Совместное использование NSDocument подклассов между несколькими окнами.

Так должны ли подклассы NSDocument быть привязаны к одному NSWindowController , или я могу разделить их между несколькими окнами? Причина, по которой я спрашиваю, заключается в том, что файлы моих приложений, вероятно, имеют размер 100 МБ (или больше), и также вероятно, что пользователь откроет один и тот же файл более чем в одном окне. Кроме того, обработка этих файлов занимает относительно много времени, поэтому было бы отлично разрешить нескольким Windows доступ к одному и тому же NSDocument . Кроме того, файлы обновляются очень быстро с большим количеством данных, поэтому синхронизация нескольких экземпляров одного и того же документа потребовала бы много процессорного времени.

Кто-нибудь делал это, или это даже можно сделать с приложением на основе документов? Мы высоко ценим любые советы по этой теме.

Комментарии:

1. Как / когда будут созданы эти другие окна для того же документа?

2. Хороший вопрос, всегда должно быть хотя бы одно окно. Остальное будет по запросу пользователя. Что касается того, как, скорее всего, с помощью NSDocumentController (вместо обычного NSDocument), но я более чем открыт для предложений.

3. Да, используйте пользовательский NSDocumentController.

Ответ №1:

Вы должны быть в состоянии использовать метод, - (void)addWindowController:(NSWindowController *)aController найденный в ссылке на класс NSDocument, чтобы сделать именно это. Будет много логики, чтобы сообщить ему, куда отправлять какие данные, но это, по крайней мере, даст вам контроль над несколькими оконными контроллерами, связанными с одним и тем же документом

Комментарии:

1. Меня больше интересует, как окно может заменить свой NSDocument другим. Мне также интересно, какой класс будет владельцем файла window nib? И как окно будет запрашивать другой NSDocument у NSDocumentController?

2. Когда я впервые изучил проекты на основе документов пару месяцев назад, я помню, как читал, что добавление контроллеров Windows обычно означало, что вы должны подклассировать window controller и установить его в качестве владельца файла, а не NSDocument. Один документ, который я прочитал, который был очень полезен, был в библиотеке Apple, Обзор приложений на основе документов

Ответ №2:

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

http://www.cocoadev.com/index.pl?DocumentBasedAppWithOneWindowForAllDocuments

Ответ №3:

Архитектура документа поможет вам управлять несколькими моделями — ie. если вы хотите, чтобы пользователь одновременно открывал несколько моделей и мог переключаться между ними, это может быть полезно для вас.

Это не мешает вам что-либо делать, это не усложняет простые вещи. Обработка Windows и GUI по-прежнему зависит от вас, и если вы не уверены, как это структурировать, не будет иметь никакого значения, используете вы документ или нет.

Если содержимое окна может со временем меняться для представления разных документов — что происходит, когда открыто много документов? Это может быть сложной проблемой для решения, и я на самом деле не имею в виду с технической точки зрения (изменить содержимое окна так же просто, как window.contentView = NewView, верно?).

Похоже, у вас много неправильных представлений о том, что такое архитектура документа и что она может сделать для вас.

Комментарии:

1. Похоже, вы не читали мой вопрос. Архитектура на основе документов очень полезна, и я хотел бы воспользоваться ее возможностями. Однако он очень тесно интегрирован, и существуют известные препятствия для его функционирования вне обычного потока документов. Различные классы очень взаимозависимы, и мне интересно о проблемах совместного использования подкласса NSDocument.

2. Я прочитал ваш вопрос. То, что вы хотите сделать, в любом случае не находится «за пределами» обычного потока документов. В NSDocument есть 1 метод, касающийся графического интерфейса – makeWindowControllers — вы можете делать с ним все, что вам нравится.

3. Существует более десятка методов NSDocument, которые ссылаются на взаимодействие с пользовательским интерфейсом и управление окнами, поэтому очевидно, что у вас на самом деле нет большого опыта в этой области, и ваша помощь больше не требуется. Спасибо.

Ответ №4:

По умолчанию для каждого документа используется один выделенный контроллер Windows. Но вы можете переопределить

 - (void)makeWindowControllers
  

чтобы создать свой собственный контроллер Windows и добавить их в документ, как упоминал Slev.