Несколько документов в одном окне в какао
Я хочу написать приложение, которое может иметь несколько документов в одном окне через интерфейс с вкладками. Следует ли мне избегать архитектуры NSDocument (шаблон приложения на основе документов Какао)? Насколько я могу судить, он поддерживает только одно или несколько окон на документ, но не наоборот.
Некоторое время я боролся с этим вопросом и уже построил большую часть своего приложения на архитектуре NSDocument, но не могу найти хороший способ связать несколько документов с одним окном.
РЕДАКТИРОВАТЬ: я хочу иметь окна документа проекта в дополнение к основным окнам документа. На этом уровне сложности стоит ли взламывать архитектуру NSDocument? Apple написала Xcode (который работает таким образом), используя архитектуру NSDocument?
4 ответа
Несколько лет назад я попытался вставить приложение NSDocument в интерфейс с одним вкладочным окном, и через несколько месяцев я был настолько разочарован, что вернулся и реорганизовал элементы архитектуры документа. Это не невозможно, но вы в конечном итоге работаете с таким количеством проблем, что конечный результат едва напоминает правильное приложение NSDocument. Лучше просто переписать нужные вам биты, чем закончить с большим количеством кода, просто чтобы разрушить каркасы Какао.
У меня такой же проект - разные независимые документы, которые я хочу представить в одном окне, с боковой панелью, позволяющей переключаться между документами, - поэтому я немного поискал сам.
Я только что нашел интересное руководство, прочитав документацию на основе документов Cocoadev с одним окном для всех документов. Из ответа MikeTrent кажется, что использование NSDocument - очень жизнеспособный способ. Вам просто нужно создать подкласс NSDocumentController.
Мне также нравится идея Абхи использовать дочернее окно без полей.
Использование архитектуры на основе NSDocument в этом случае не обязательно является плохой идеей; но это может потребовать немало хакеров.
Вполне вероятно, что вам придется не только подкласс NSDocument, но и реже его подкласс NSDocumentController. После того, как это будет сделано, должно быть очень просто перехватить и избежать вызовов -makeWindowControllers и других связанных с окном методов, что позволит вам обернуть "окна" документа любым удобным для вас способом, но при этом сохранить преимущества документа. на основе приложения.
Еще один метод, который я еще не пробовал, но планирую использовать, - создать окно без полей для каждого документа. Таким образом, один документ имеет одно окно, которое может быть или не быть видимым.
Затем создайте окно-оболочку, содержащую фактическую границу окна, и любые элементы управления для переключения между тем, какие окна / окна документа без полей видны. Окно документа является дочерним окном оболочки, которое гарантирует, что оба будут связаны, когда окно будет перемещено / свернуто / закрыто / и т.д.
Для каждого окна документа без полей окно-обертка имеет вид заполнителя, который при изменении размера будет изменять размер окна документа, а также вставлять представление окна документа в цепочку респондента (любое событие, отправленное представлению заполнителя, будет отправлено в документ представление окна перед передачей в родительский вид заполнителя).
Есть еще некоторые мелкие детали, которые нужно проработать, но я думаю, что этот подход будет работать хорошо.