忙しい人向けの Build document-based apps in SwiftUI - #WWDC20
ドキュメントベースのアプリとは
人々は Mac の Finder や iOS の File アプリを利用してファイルを管理してきた。
これらは、その場でシームレスにアプリを開いて表示・編集できることを期待する。
Pixelmator など一度に複数のファイルを開くことができるものもある。このようなドキュメントの管理を行うアプリのことを『ドキュメントベースのアプリ(document-based app)』と呼んでいる。
Xcode はドキュメントベースのアプリには見えないが、eml ファイルやクラッシュレポートなどの追加のドキュメントを開く機能をサポートしている。
SwiftUI での作成方法
ドキュメントを扱うには DocumentGroup を利用する。引数で指定しているタイプ(ここでは TextDocument)を管理することを宣言している。
コードの階層は、アプリの所有権の階層と一致する。ここでは単一の DocumentGroup が含まれており、複数のウィンドウで開くことができるが・・・
複数のドキュメントグループをサポートすることもできるし・・・
WindowGroup と組み合わせて使うこともできる。
SwiftUI は各プラットフォームに最適化した形で表示される。例えば Mac では次のような機能を備えたアプリになり・・・
iOS では次のようになる。
デモ
以下のようなシェイプエディタを作成していく。
Multiplatform の Document App を選択して作成する。
生成されたテンプレートコードで実行すると、先ほど解説したプラットフォームの機能をもったテキストエディタが実行される。
特定のファイルをサポートするには、Info.plist の設定を編集する必要がある。サポートする Identifier を Document Types で指定したり、独自のファイルタイプについては Exported Type Indentifiers で指定する必要もある。
クロージャの引数から Binding を取得しているが、これは元のデータへの読み書きのアクセスを提供するもの。
ドキュメントを読み書きするには、ディスク上のドキュメントを表現する FileDocument プロトコルに準拠した型を作成する。readableContentTypes プロパティで読み込めるタイプを UTType で指定する。
ファイルの読み込みはイニシャライザで実装する。今回は JSON で表現することにし、JSONDecoder を利用した。
ファイルの書き込みは write メソッドで実装する。引数の FileWrapper が inout で宣言されており、これが書き込み先となるため、この引数を上書きするか変更する必要がある。
なお、この型は値型を利用しているため Copy on Write や、ユーザが編集中でも裏で保存できるなどのメリットを受けられる。
最後に、サンプルデータをイニシャライザで与えてみると・・・
無事に表示できることが確認できた。
免責
・本記事は公開情報のみに基づいて作成されています。
・要約(意訳)のみなので、詳細はセッション動画をご確認ください。
関連記事
役に立った記事などありましたらサポート頂けると嬉しいです。