Mac Catalystでファイルを開く/保存する
要はNSOpenPanel、NSSavePanelでやってたことをMac CatalystでつくったmacOSアプリではどう実現するか、という話
## UIDocumentBrowserViewControllerを使う
let browser = UIDocumentBrowserViewController(forOpeningFilesWithContentTypes: types)
present(browser, animated: true, completion: nil)
これだけ。macOSで実行するとNSOpenPanel的なものでmacOSのファイル階層をたどってファイル指定できる。
引数`forOpeningFilesWithContentTypes`にはUniform Type Identifier (UTI) をString型で指定する。
たとえば画像だけ選択できるようにしたい場合はこうなる。
let types = [kUTTypeImage as String]
UTIの一覧はこちら。
## UIDocumentPickerViewControllerを使う
UIDocumentBrowserViewControllerとほぼ同じように使えるので解説を省略。ちなみにこっちのほうが古いようだが、違いはよくわかってない。(必要が出てきたら調べる)
## ファイルアクセスタイプの指定
ただし上の実装だけでMac向けにビルドしていざファイルを選択しようとすると、
ERROR: Unable to display open panel: your app is missing the User Selected File Read app sandbox entitlement. Please ensure that your app's target capabilities include the proper entitlements.
というエラーになる。
ファイルアクセスのアクセス権の設定が必要。
具体的には、[Signing & Capabilities] > [App Sandbox]の欄で、各File Access Typeに対して必要なPermission&Accessを選択する。
これをやると`.entitlements`ファイルに必要なkey&valueが追加されていく。
ちなみにopenするにもexportするにもwrite権限が必要なようだ。
## ファイル選択されたときの処理の実装
ファイル選択されたときのイベントをハンドリングするにはUIDocumentBrowserViewControllerDelegateに準拠する。ちなみにどのメソッドもoptional。ファイル選択時には〜didPickDocumentsAt〜が呼ばれる。
extension ViewController: UIDocumentBrowserViewControllerDelegate {
func documentBrowser(_ controller: UIDocumentBrowserViewController, didPickDocumentsAt documentURLs: [URL]) {
print(documentURLs)
}
}
これを実装した上で、`UIDocumentBrowserViewController`の`delegate`プロパティにオブジェクトをセット。
browser.delegate = self
UIDocumentPickerViewControllerの場合もほぼ同様なので省略。
## フォルダを選択させる
これはStackOverflowでも質問への回答がなくなかなか困った。
ここから先は
¥ 300
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/