Функция Lost with Window resume, автосохранение в пользовательских настройках и сохранение в модели для NSDocument
Я запустил небольшое приложение на основе документов с NSOutlineView в главном окне.
Я сохранил свою модель в файлах, используя протокол NSCoding в классах моделей, и все в порядке.
Затем я захотел сохранить пользовательский интерфейс (размер и положение окна, расширенные элементы в виде схемы, выбор,...), и я обнаружил, что функция возобновления добавлена в Lion.
Итак, я попытался реализовать его, я добавил имя автосохранения в основное окно и представление схемы, задал свойство autosaveExpandedItems и реализовал метод outlineView: itemForPersistentObject: и outlineView: persistentObjectForItem: в источнике данных представления схемы.
Это работает, но когда я создаю/открываю другой файл, а затем закрываю его, состояние расширенных элементов других файлов устанавливается с состоянием закрытого файла.
Это похоже на приложение, которое сохраняет только одно окно для всех документов, а не одно окно на документ.
Я немного потерялся с автосохранением и возобновлением, это одна и та же функция или две функции, совершенно разные?
Могу ли я использовать его для сохранения состояния окна или мне нужно сохранить его в моей модели?
Спасибо
Ответы
Ответ 1
Я понимаю, что это около 3 лет слишком поздно, но, возможно, это поможет всем, кто попадает сюда.
Я никоим образом не являюсь экспертом или профессиональным разработчиком Mac Cocoa (все еще изучаю), поэтому, боюсь, я могу лишь немного рассказать о себе (сам работая над документированным приложением).
Возможно, что реализация данных состояния сохранения для каждого окна и каждого элемента управления просто связывает его с одним экземпляром (поскольку все они предварительно загружены в xib и привязаны к одному имени автосохранения), но я может быть неправильным. Любой, кто знает больше, может исправить меня.
Возможно, попробуйте сохранить информацию о состоянии на уровне NSDocument вместо окна, а затем выполните window(window: NSWindow, willEncodeRestorableState state: NSCoder)
и window(window: NSWindow, didDecodeRestorableState state: NSCoder)
, чтобы извлечь данные из вашего документа.
Вы можете, конечно, легко получить доступ к документу для текущего окна: view.window?.windowController?.document as? YourNSDocumentSubclass
Это более или менее то, что я делаю, и пока это кажется многообещающим. Другие архитектурные гуру могут предложить больше понимания.