#macos #cocoa #nsdocument #document-based
#macos #cocoa #nsdocument #на основе документов
Вопрос:
Есть ли у кого-нибудь здесь опыт работы с приложениями на основе документов на macOS, в которых вы можете создать тип файла документа, который пользователь не может сохранить через приложение? Наличие выпадающего списка переименовать / переместить с отключенными полями имени и местоположения?
Хотел бы начать с вопроса, прежде чем переходить к объяснению сценария ниже.
Я пытаюсь реализовать промежуточный тип файла для моего приложения на основе документов. Представьте это как своего рода промежуточный файл проекта, который описывает редактирование / комбинацию носителей, но если пользователь попытается закрыть окно, ему будет предложено экспортировать носитель в окончательный формат (не промежуточного типа).
Я пытаюсь использовать то, как работает QuickTime Player. В QuickTime Player, если вы открываете видео, оно действует как программа просмотра и позволяет переименовывать / перемещать файл через выпадающий список, нажав на заголовок:
https://i.stack.imgur.com/a5WGr.png [Скриншот, показывающий выпадающий список переименовать / переместить из QuickTime Player]
Примечание: Показалось интересным, что по какой-то причине опция блокировки отключена. Это не тот случай, когда я открываю файл в своем.
Теперь, когда вы перетаскиваете другое видео на это в QuickTime, вы создаете композицию из двух, и окно превращается в документ без названия, который помечен как отредактированный. Похоже, это делается с помощью нового типа файла документа, который они создали с расширением qtpxcomposition. Просмотр списка приложений QuickTime Player показывает, что у них есть два типа композиций QuickTime Player под идентификаторами com.apple.quicktimeplayerx-композиция и com.apple.quicktimeplayerx-composition-bundle, использующий одно и то же расширение. Это также показывает, что приложение QuickTime Player настроено как редактор этих типов. Это я понимаю и реализовал свой собственный экспортированный UTI таким же образом с другим расширением. У меня даже получилось, что я создаю временный файл такого типа, открываю документ с его содержимым и заставляю его заменить текущее окно. Однако большая разница, которую я нахожу, заключается в том, что выпадающий список переименовать / переместить полностью включен в моем, что означает, что пользователь может сохранить мой промежуточный файл. В QuickTime Player вы можете видеть здесь, что это не так:
https://i.stack.imgur.com/yrCab.png [Скриншот, показывающий выпадающий список переименования / перемещения файла qtpxcomposition в QuickTime Player]
Имя, где и заблокированные параметры отключены. Пользователь может добавлять только к тегам, и в результате выпадающий список тегов автоматически открывается при открытии этого выпадающего списка переименования / перемещения. Я не смог выяснить, как это делается. Поскольку это документ без названия, загружаемый из содержимого файла, у него нет пути, если щелкнуть правой кнопкой мыши заголовок (мой делает то же самое), и вы не можете переименовать / переместить его, поскольку у них эти опции отключены. Вы обнаружите, что все опции «Сохранить», «Переименовать» и «Переместить в» отключены в меню «Файл», и если вы закроете окно, появится диалоговое окно сохранения, которое экспортирует композицию в виде файла .mov, как показано здесь:https://i.stack.imgur.com/bf5w9.png. Это означает, что приложение фактически скрыло любой реальный способ для пользователя сохранить этот промежуточный файл. Кто-нибудь знает, как они это сделали?
Из моего тестирования кажется, что этот выпадающий список присутствует только тогда, когда вы возвращаете YES для (BOOL)autosavesInPlace
, и это то, что также вызывает отображение запроса на сохранение при попытке закрыть окно документа без названия. Хотя я знаю, что QuickTime Player устанавливает конкретное местоположение для сохранения автосохранений. А именно в /Users / …/Library /Containers/com.apple.QuickTimePlayerX / Данные / Библиотека / Автосохранение информации. Мне все еще нужно выяснить, как правильно настроить автосохранение в таком месте (я предполагаю, через NSURL * autosavedContentsFileURL
), но я не подозреваю, что это как-то связано с тем, почему поля имени и местоположения отключены.
Вещи, которые я пробовал, включают возврат ошибки из checkAutosavingSafetyAndReturnError
, тестирование того, что делает возврат ДА или НЕТ из preservesVersions
или autosavesDrafts
, а также тестирование идеи блокировки документа. Однако ни одно из них не сработало. В большинстве из них файл был помечен как «Заблокированный», но пользователь мог просто открыть этот выпадающий список переименования / перемещения и разблокировать его. Учитывая, что файл не помечен как заблокированный в QuickTime Player, я не думаю, что такая блокировка также является его частью.
Другой подход, который я мог придумать, заключался в том, что они получают доступ к самому выпадающему списку и отключают эти текстовые поля, но я не нашел никакого способа получить доступ к этому выпадающему списку. Не нашел никаких методов делегирования или переопределяемых методов, которые могли бы мне это дать. Самое близкое, что я нашел, было в NSWindow, где вы можете переопределить - (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu
но это просто ссылается на всплывающее окно path, которое появляется, когда вы щелкаете правой кнопкой мыши по заголовку. Который для документа без названия, подобного этому, уже ничего не делает.
Я не уверен, что еще я могу попробовать на данный момент, и мне не повезло найти кого-либо еще, спрашивающего о подобных вещах в Интернете. Единственный ответ, который я видел, как кто-то давал на отключение этого выпадающего списка, возвращал nil при нажатии этой кнопки, однако это не работает. Хотя шеврон справа от заголовка исчез, это не останавливает работу функциональности, если вы нажмете на заголовок.
Кто-нибудь имеет представление о том, как это делается в QuickTime Player?