1

ユーザーが画像とテキストを使用してグラフィック コンテンツを作成できる iPad アプリを作成しています。これをカスタム UIView サブクラスの配列のメモリに格納しています。これらの各ビュー サブクラスは、イメージまたはテキストを含むサブビューをいくつでも持つことができます。

次に、これらをデバイスに保存する必要があります。調べてみると、これを行うには多くの方法があるようで、この場合に最適な方法を知りたいと思っています。

4

4 に答える 4

2

最終的に描画アプリになるもののアーキテクチャ設計を求めているようです。これは、実際には特定のユースケースに依存することが最善であり、要件の非常に詳細なリストを提供しない限り、完全に回答できないことを意味します.

しかし、一般的には、あなた自身の特定の核心的な実装と統合する必要がある一般的なヒントをいくつか提供しようとすることができます.

この説明では、このようなアプリが必要とする基本的な使用例に関して、いくつかの仮定を行います。

  • ユーザーは、複数のツールを使用してイメージを作成し、結果を得ることができます。これらは、ブラシからテキストフィールドまで、何でもかまいません。
  • 画像の作成に使用されたツールと、このツールが画像の現在の外観にどのように影響したに関する情報を保存して、後でユーザーが画像を編集できるようにすることができます。

これは、主な問題は次のとおりです。後で復元するために描画状態を保存する方法は?

それを達成する方法は確かにたくさんありますが、そのうちの2つは「クリーンで十分に有名」と見なされるものだと思います.

NSKeyedArchiver

これは私のお気に入りではありませんが (維持するのが難しい)、UIView を扱う必要がある場合は、おそらく最も速いでしょう。NSKeyedArchiverは_

.. NSCoder の具体的なサブクラスであり、オブジェクト (およびスカラー値) を、ファイルに格納できるアーキテクチャに依存しない形式にエンコードする方法を提供します。

これはMemento 設計パターンを実装しており、 Pro Objective-C 設計パターンで説明されているのと同じパターンであり、偶然にも、あなたのものに一致する最も重要なユースケースの多くを含むケーススタディを提示します:

  • ドローイング パッドでは、ユーザーの指で落書きができます。
    [...]
  • ユーザーは落書きを保存できます。
  • これにより、ユーザーは保存された落書きを開くことができます。
    [...]

指で線が描けるお絵かきパッドのアプリです。あなたのものは、落書きの代わりに画像とテキストを使用して、これを簡略化したバージョンのように見えます。

では、この特定のケースでは、NSKeyedArchiverを使用する利点は何ですか? UIViewは、オブジェクトをアーカイブするために必要なNSCoding プロトコルを既に実装しています。したがって、保存する必要があるほとんどの情報 (座標、フレーム サイズ、背景色など) については、オブジェクトをアーカイブする以外に何もする必要はありません。

UIView の上にある追加の属性 (たとえば、UIImageView のアーカイブは非常にコストがかかるため、画像のローカル パス)については、この記事を参照してください。NSKeyedArchiverを利用してオブジェクトの状態を保存します。

これはすべて次のように要約されます。

  1. 描画アプリが提供するツールごとに NSCoding プロトコルを実装する
  2. ユーザーが作成したサブビュー (画像、テキストなど) を追跡する
  3. ユーザーが「保存」を押すと、それらをループし、アーカイブを作成して、適切なパスに保存します。パスの最初の要素は図面の名前、2 番目の要素はツールの名前、3 番目の要素はツールが使用されたときの ID です。お気に入り

    // A mountain image
    /<path to you Document dir>/Mountains/Image/1
    
    // A sun
    /<path to you Document dir>/Mountains/Image/2
    
    // The text "Mountain is awesome"
    /<path to you Document dir>/Mountains/Text/1  
    
  4. それからもちろん、図面名のリストを plist ファイルまたはNSUserDefaultのいずれかの場所に保存する必要があります。これにより、ユーザーが編集のためにそれらを復元したい場合にそれらを表示できるようになります。

コアデータ

これはおそらく、オブジェクトの状態を保存する最もクリーンで保守しやすい方法ですが、特にコア データを初めて使用する場合は、少し難しくて面倒です。Core Data について掘り下げるつもりはありませんが、手順全体のガイドラインをいくつか紹介できます。基本的:

  1. ユーザーに使用させる各ツールを表す db スキーマを作成します。同様に: Imageのテーブル、Textのテーブルなど
  2. 各テーブルに、覚えておく必要がある属性を配置します (場所、「テキスト」のテキストの色、「画像」の画像 URL など)。
  3. ユーザーが作成するDrawingのテーブルを、ツール テーブルとの 1 対多の関係で作成します。この関係は、図面に示されているオブジェクトを表しています。
  4. データベースに保存されている内容に従って、描画キャンバスと各コンポーネントを初期化します
  5. ユーザーが「保存」を押すたびに、現在の図面構成をストレージに反映するために、適切なデータベース テーブルを作成または更新します。

このアプローチの利点の 1 つは、ある日、ツール コンポーネントのプロパティを変更したり、新しいプロパティを追加したりする場合に、スキーマの移行を利用して、新しい更新との下位互換性を提供できることです。そのため、ユーザーは引き続き古い図面を使用できます。

などなど…。

これらは無限の可能性のうちの 2 つです。以下も使用できます。

  • NSUSerDefaultを使用して状態を保存しますが、これは避けることをお勧めします。メンテ大変だろうな
  • 前述の 2 つの手法の組み合わせ
  • >= iOS6 のみのサポートを提供する予定がある場合は、これを確認できます

私が説明した 2 つは、これを行うための通常の方法であり、最も議論されている方法です。本やチュートリアルでそれらを見つけることができ、あなたがしなければならないことに対して非常に多くの柔軟性を与えてくれます.
さらに説明的なリンクが必要な場合は、お知らせください。

于 2013-08-08T13:45:43.447 に答える
1

最良のオプションは、フォルダーで使用UIDocumentすることです。NSFileWrapper次に、コンテンツが変更されたときに自動的に保存される 1 つのフォルダーにすべてのファイルを保存できます。参照: http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/DocumentBasedAppPGiOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011149-CH1-SW1

于 2013-08-07T23:48:04.043 に答える