Открыть файл с приложением в двух экземплярах - PullRequest
0 голосов
/ 12 июня 2018

Идея состоит в том, что у меня есть шаблон файла, который нужно открыть, но он должен вести себя так, как будто открывалось только содержимое файла, а не сам файл.

Разница для пользователядолжно быть, ему нужно выбрать место для сохранения файла, а не просто перезаписывать файл, который был открыт.

Подобное поведение можно увидеть в приложении Preview.При дублировании функции Preview откроется тот же файл в новом окне.При сохранении файла пользователю необходимо указать, куда его сохранить.

Насколько я вижу, NSWorkspace не поддерживает такое поведение из коробки.Кто-нибудь знает обходной путь для этого?Я был бы признателен!

РЕДАКТИРОВАТЬ

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

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

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

1 Ответ

0 голосов
/ 17 июня 2018

Этого можно достичь, отправив «Открытое содержимое» ('ocon' / kAEOpenContents) Apple Event в целевое приложение.Возможно, самый простой способ - использовать Scripting Bridge .

. Обычный способ использования Scripting Bridge требует, чтобы вы заранее знали, на какое приложение вы хотите нацелиться, и сгенерировали заголовок Objective-C.из его определения интерфейса сценариев.Тем не менее, вы должны быть в состоянии использовать его «сырой».Например, что-то вроде этого:

SBApplication *app = [SBApplication applicationWith...:...]; // there are method to take a PID, a bundle ID, or a URL
[app activate];
NSAppleEventDescriptor *desc = [NSAppleEventDescriptor descriptorWithString:@"foobar"];
[app sendEvent:kCoreEventClass id:kAEOpenContents parameters:keyDirectObject, desc, nil];

Объект NSAppleEventDescriptor - это содержимое содержимого, в данном случае строка "foobar".Вы можете использовать другие методы для создания различных типов полезных нагрузок.Если вы используете универсальный и вам нужен тип дескриптора, вы можете посмотреть заголовки в /System/Library/Frameworks/CoreServices.framework/Frameworks/AE.framework/Headers (например, AEDataModel.h или AERegistry.h).

...