Как разрешить пользователям сохранять файл в указанный каталог c и указывать имя файла в приложении macOS? - PullRequest
1 голос
/ 14 июля 2020

Я создал приложение iOS на Swift и добавляю некоторые функции для macOS Catalyst.

В моем приложении я создаю файл .txt после нажатия кнопки. Я хочу представить UIDocumentPickerViewController, который позволяет пользователю указать каталог для сохранения и имя файла. Пока я могу отображать только UIDocumentPickerViewController без возможности присвоения имени файлу или сохранения. UIDocumentPickerViewController - правильный контроллер представления, чтобы выполнить sh это? Если да, то как мне указать каталог для сохранения и имя файла?

Вот код, который я использую для представления UIDocumentPickerViewController

#if targetEnvironment(macCatalyst)
            
            let str = "Hello boxcutter"
            let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
            let fileURL = documentsURL.appendingPathComponent("boxCutter.txt")
            try! str.write(to: fileURL!, atomically: true, encoding: String.Encoding.utf8)
            
            let types: [String] = [kUTTypeFolder as String]
            let documentPicker = UIDocumentPickerViewController(documentTypes: types, in: .open)
            documentPicker.delegate = self
            documentPicker.allowsMultipleSelection = false
            documentPicker.modalPresentationStyle = .formSheet
            self.present(documentPicker, animated: true, completion: nil)

#endif

1 Ответ

0 голосов
/ 08 августа 2020

Вы можете использовать NSSavePanel , чтобы спросить пользователя, где сохранить файл. Это API macOS, к которому нельзя напрямую получить доступ из приложений Catalyst, но вы можете создать плагин macOS, который будет иметь доступ к API macOS, как описано здесь . Или используйте библиотеку, например Dynami c (полное раскрытие: я автор) , чтобы добиться того же без плагина:

let nsWindow = Dynamic.NSApplication.sharedApplication.delegate.hostWindowForUIWindow(view.window)

let panel = Dynamic.NSSavePanel()
panel.nameFieldStringValue = "boxCutter.txt"
panel.beginSheetModalForWindow(nsWindow, completionHandler: { response in
    if response == 1 /*OK*/ {
        print("file URL: ", panel.URL.asURL)
    }
} as ResponseBlock)

typealias ResponseBlock = @convention(block) (_ response: Int) -> Void
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...