WWDC Quick Look 💓 By SwiftGGTeam
Build document-based apps in SwiftUI

Build document-based apps in SwiftUI

元の動画を見る

ハイライト

SwiftUI DocumentGroup アプリがシーンを使用してドキュメントのオープンと管理機能を宣言できるようにし、システムはドキュメント ブラウザ、標準ドキュメント コマンド、macOS ステータス追跡とハンドオフ、iOS ドキュメントの閲覧と共有インターフェイスを提供します。


主要内容

ユーザーは、タグ、クラウド ファイル プロバイダー、外部ストレージ デバイスを使用して、Finder アプリとファイル アプリでファイルを整理します。ファイルを開くとき、ユーザーはアプリが元のドキュメントを直接編集することを期待します。アプリがファイルを独自のデータベースにインポートするだけの場合、ユーザーはコピーを変更することになりますが、元のファイルはそれに応じて変更されません。

このような機能は、プロのクリエイティブ ツールに限定されたものではありません。 Pixelmator、Keynote、Final Cut Pro の主な仕事はドキュメント管理を中心に展開しています。 Xcode、Mail、および Console では、メイン インターフェイスの外でプロジェクト、EML ファイル、またはクラッシュ レポートも開きます。重要な点は、ファイルをアプリのプライベート データに飲み込むのではなく、ファイル自体を開いて編集することです。

SwiftUI はこの機能を DocumentGroup。アプリは依然としてアプリ、シーン、ビューで構成されています。シーンが次のように置き換えられたとき DocumentGroup、このアプリが特定の種類のドキュメントを開いて管理することをサポートしていると宣言しています。次に、SwiftUI は、macOS のステータス追跡やハンドオフ、iOS のドキュメント ブラウザ、ナビゲーション バーの検索、共有ポータルなどのプラットフォーム動作を追加します。

デモは、iPad Playground での描画プロトタイプから始まります。ティナはそれを ShapeEdit というマルチプラットフォーム アプリに組み込み、最初にシステムが認識できるドキュメント タイプを構成し、次にドキュメント モデルを実装させました。 FileDocument、そして最終的にデフォルトを置き換えました TextEditor キャンバス付き。最終的には、描画アプリを使用して描画を保存し、後で再度開くことができるようになります。

詳細

DocumentGroup はドキュメント管理を Scene に接続します

(02:00) SwiftUI アプリケーションは、App、Scene、View で構成されます。ドキュメント サポートを追加する場合、新しいシーン タイプは次のようになります。 DocumentGroup。アプリのシーンとして単独で使用することも、複数のシーンと組み合わせて使用​​することもできます。 DocumentGroup または WindowGroup 同じアプリ内で。

(02:12) 公式の「コード」タブの最小限の例はテキストエディタです。

@main
struct TextEdit: App {
    var body: some Scene {
        DocumentGroup(newDocument: TextDocument()) { file in
            TextEditor(text: file.$document.text)
        }
    }
}

キーポイント:

  • @main アプリの入り口をマークします。 body シーンを返します。
  • DocumentGroup(newDocument: TextDocument()) 新しいドキュメントを作成するときに使用されるベースドキュメントを宣言します。
  • file によって渡されるファイルコンテキストです。 DocumentGroup 閉鎖。
  • file.$document.text 読み取り/書き込みバインディングを提供し、 TextEditor ドキュメント内のテキストを直接編集できます。
  • トランスクリプトは、06:49 で、このバインディングによりテキストが更新されたことを SwiftUI に知らせ、元に戻すことを登録し、ドキュメントをダーティ状態にマークする責任があると説明しています。

ドキュメント タイプにより、まずシステムがファイルを認識します。

(04:43) Xcode のドキュメント アプリ テンプレートは、Document Type を Info.plist に追加します。内部の識別子はUniform Type Identifierで、システムがディスク上のファイルをアプリに関連付けるために使用します。

(05:07) プレーンテキスト このタイプの型は他の場所で宣言されており、アプリはそれをインポートするだけで済みます。 ShapeEdit は独自の描画形式を定義する必要があるため、エクスポートされたタイプ識別子を入力する必要があります。形式の説明を記述し、公開データおよび公開コンテンツに準拠させてから、ファイル拡張子を割り当てます。

(08:24) トランスクリプトでは、以下を具体的に区別しています。 importedAs そして exportedAs。インポートされた型は、インストールされているアプリによって値が変わる可能性があるため、計算変数です。エクスポートされた型は現在のアプリによって所有され、定数として宣言できます。

FileDocument はディスク上のドキュメントを定義します

(07:41) ShapeEdit のドキュメント タイプは値タイプであり、 FileDocument プロトコル。このプロトコルはディスク上のドキュメントを表します。最初のステップは定義することです readableContentTypes、これは配列です UTType。 SwiftUI はこの配列を使用して、ユーザーが開こうとしているファイルの種類がアプリでサポートされているかどうかを判断します。

(09:11) ドキュメントを読み取ると、初期化メソッドが取得されます。 FileWrapper そして contentType。デモで使用するのは、 JSONDecoder テンプレートコードを削除した後、ドキュメントタイプは以下に準拠する必要があります。 Codable

(09:43) ドキュメントを書き出すとき、メソッドはターゲットも受け取ります FileWrapper そして contentTypeFileWrapper これは、新しいラッパーを作成したり、既存のラッパーを更新したりできる inout パラメーターです。デモで使用するのは、 JSONEncoder ドキュメントをファイルに書き戻します。

(10:12) ドキュメント モデルは構造体であるため、値型のコピーオンライト動作は保持されます。トランスクリプトによって得られる実際の利点は、ユーザーがまだ描画している間に、アプリがすでに保存を開始できることです。

テキスト テンプレートから描画ドキュメントに切り替える

(10:32) ドキュメント サポートの準備ができたら、プレイグラウンドのキャンバス コードをプロジェクトに追加するデモを行います。プロジェクトにはグラフィック プロパティを記述するグラフィック タイプと、グラフィックを表示するキャンバス ビューがあります。

(10:56) 次に、ドキュメントのデータ型をテキストからグラフィック型に変更し、最初のグラフィックを追加して置き換えます。 TextEditor キャンバス付き。最後に ShapeEdit を実行すると図面を保存でき、後で同じ図面を開くことができます。

重要ポイント

  • テキストドキュメントエディタ

    内容: 生のテキスト ファイルを開く軽量エディタを作成します。 実行する価値がある理由: DocumentGroup すでにドキュメントを開いたり管理したりすることはできますが、 TextEditor に直接バインドできる file.$document.text開始方法: まず、公式スニペットを使用して実行してください。 DocumentGroup(newDocument:)、次にドキュメントタイプを準拠させます FileDocument、読み取り可能な型を次のように入力します。 readableContentTypes

  • 描画またはホワイトボード アプリ

    やるべきこと: iPad Playground の描画プロトタイプを、ファイルを保存できるマルチプラットフォーム アプリに移行します。 実行する価値がある理由: セッションの ShapeEdit デモは、キャンバスのプロトタイプから始まり、図面を保存して再度開くことで終了します。 開始方法: まずグラフィック タイプとキャンバス ビューを定義し、次にドキュメント データをテキストからグラフィック タイプに変更して、 JSONDecoder そして JSONEncoder 読み取りおよび書き込みレイヤーを処理します。

  • ログまたはクラッシュ レポート ビューアー

    何をすべきか: EML、クラッシュ レポート、またはログ ファイルを開くためのエントリを共通ツール アプリに追加します。 実行する価値がある理由: トランスクリプトでは、メールとコンソールのメイン インターフェイスがドキュメント ベースではないことを明確に述べていますが、それでも追加のファイルを開くことはサポートされています。 開始方法: オリジナルを保持します WindowGroup それを DocumentGroup ファイルを開くシナリオを具体的に処理します。

  • カスタム形式のプロジェクト ファイル

    何をすべきか: デザインドラフト、エンジニアリング構成、または創造的なプロジェクト用に独自のファイル形式を定義します。 実行する価値がある理由: システムでは、UTI がディスク ファイルをアプリに関連付ける必要があります。 ShapeEdit は、エクスポートされたタイプ識別子を通じて独自の形式を宣言します。 開始方法: Info.plist のドキュメント タイプとエクスポートされたタイプ識別子で同じタイプ識別子を使用し、タイプをパブリック データおよびパブリック コンテンツに準拠させ、拡張子を割り当てます。

関連セッション

コメント

GitHub Issues · utterances