2013-06-16 7 views
0

В моем проекте мне нужно уметь различать документы, созданные пользователем, и те, которые были восстановлены при запуске приложения restoreStateWithCoder, потому что есть некоторые вещи, которые должны быть сделано для новых документов, но не восстановлено. Как я могу это сделать?Дифференциация между новыми документами и восстановленными документами в приложении Cocoa

ответ

0

Как насчет подкласса «NSDocument» и с использованием этого подкласса для вашего документа?

Затем вы можете поймать «restoreStateWithCoder», как это происходит, и установить уникальный флаг (например, свойство BOOL) для тех документов, которые восстанавливаются с диска и не создаются свежим с помощью команды «Файл -> Создать».

Вы также можете попробовать "method swizzle" "restoreStateWithCoder", но вам нужно решить, какое свойство установить в каком объекте.

+0

Я уже использую подкласс NSDocument, который пришел с проектом и реализует restoreStateWithCoder, чтобы реализовать пользовательские инструкции по восстановлению. Проблема заключается в том, что подготовительные действия, упомянутые в исходном сообщении, происходят в windowControllerDidLoadNib, который происходит перед восстановлением, делая любые настраиваемые флаги спорными. –

+0

Что вы делаете, и почему вы не можете отключить или скрыть их, как только вы поймете, что файл был восстановлен и не совсем новый? –

+0

Приложение на самом деле является веб-браузером, поэтому, несмотря на то, что я использую архитектуру нескольких документов, нет реального документа. Я использую windowControllerDidLoadNib для создания новой вкладки при открытии нового окна и, при необходимости, в зависимости от предпочтений пользователя, загрузки домашней страницы. Это связано с восстановлением табуляции. Я мог бы просто очистить вкладку сразу после создания при восстановлении, но это кажется ужасно неэффективным и расточительным. –

0

[Ответ это для Свифта, но общая идея работает для Objective-C, а]

Когда документ является новым, вы обычно получаете вызов следующей функции:

convenience init(type tyepName: String) throws 

Вы можете установить флаг в этой функции (скажем needSpecialHandling = true, переменная, которая первоначально была инициализирована до false), чтобы сказать, нужна ли вам специальная обработка для таких случаев.

Тогда в функции makeWindowControllers() вы используете эту переменную, чтобы вызвать применение специального кода (если true) так же, как это возможно, вызывается в функции windowControllerDidLoadNib.

Смежные вопросы