0

次のようなiPhoneアプリケーションのメインリストデータをどこに保存するかについてのアドバイスはありますか?

  • NavigationControllerベース
  • レベル1(メイン画面)はアイテムのリストです。したがって、テーブルビュー(アイテムのテーブル)を使用します
  • レベル2_EDIT:[編集]をクリックしてメイン画面からアクセスできるビューです。ここで、メインビューリストに追加するテキストを追加できます
  • レベル2_DETAIL:セルをクリックしてメイン画面からアクセスできるビューです。

ここで、実装が(大まかな概要)であると仮定します。* MainView--appDelegate(holds UIWindowUINavigationController)* RootViewController--メインアイテムリストのテーブルビュー(ここでは?変数?)* EditViewController-メインリストに追加する入力テキスト* DetailViewController-レコードの詳細を表示します

質問NSArray-アイテムのメインリストを保持するをどこに保持しますか?RootViewControllerそれを表示するのはテーブルビューが存在する場所にあるべきですか?それとも、より高い位置にある必要がありApplicationDelegateますか?RootViewControllerに移動するとEditViewController、この編集ビューで配列に項目を追加する必要があることに注意してください。そのため、のコードが(ではなく)EditViewControllerからメイン配列にアクセスする方が簡単でしょうか。AppDelegateRootViewController

(注-MVCに関して、特定のモデルオブジェクトを持つアプリはまだ作成されていないため、これが問題になるかどうかはわかりません。)

4

2 に答える 2

3

データはテーブル ビューのデータ ソースになり、必須ではありませんが、多くの場合、テーブル ビューを含むビュー コントローラーがデータ ソースの役割を果たします。ビュー コントローラーは、EditViewController のデリゲートになることもできるため、EditViewController はそれにメッセージを送信して、配列を更新できるようにします。

Apple の CoreDataBooks サンプル プロジェクトは、同様のアーキテクチャを示しています。ご覧になることをお勧めします。

アプリケーション デリゲートに配列を含めることは、多くの場合、優れたアイデアではありません。少しは便利ですが、クラスは完全にアプリケーション デリゲートに不必要に依存しています。


テーブル ビューにデータが表示されます。これは、MVC デザイン パターンのViewに相当します。パターンでコントローラーRootViewControllerとして機能するテーブルビューのビューコントローラーだと思います。場所がまだ決まっていないあなたのデータはModelに対応します。ModelViewをつなぐ役割になります。RootViewController

MVC パターンの理想または理由は、モデルとビューを分離することです。これにより、モデルは適切なコントローラーを備えた他のビューと連携でき、ビューも適切なコントローラーを備えた他のモデルと連携できます。たとえばRootViewController、テーブル ビューにデータを提供します。セクションと行の数、セルの内容など、テーブルビューの言語でデータを指定します。グラフなど、別の方法でデータを表示する場合、コントローラーは同じものにアクセスしますデータ (モデル) を表示し、グラフ ビューに同じデータの異なる表現を提供します。モデルもビューも変更する必要はありません。モデルとビューの組み合わせごとに、コントローラーのみを記述します。

したがって、理想的には、モデルに対して別のクラスを用意します。このクラスでは、配列を格納し、コントローラーがデータとやり取りできるように一般的なインターフェイスを提供します。

ただし、モデル クラスを頻繁に使用する可能性が低いか、モデル自体が単純すぎてどこにでも簡単に実装できるため、多くの場合、それほど必要ではありません。たとえば、テーブルのデータが単純な配列の場合、多くの場合、モデルの役割には NSArray オブジェクトで十分です。そのため、コントローラとモデルを 1 つのオブジェクトに結合するというアイデアが生まれました。

これが、Table View Controller がしばしば Table View のデータ ソースとして機能することが理にかなっている理由です。

ただし、データをアプリケーション デリゲートに格納することは、まったく別の考え方です。これで、アプリケーション デリゲートがモデルになりますが、アプリケーション デリゲートは特定のアプリケーションにのみ使用されるため、意味がありません。単一のアプリケーションに完全に依存する別のモデル オブジェクトを用意する必要があるのはなぜですか? また、テーブル ビューがアプリケーション デリゲートと直接やり取りする場合、そのビューは特定のアプリケーションのアプリケーション デリゲートに依存するようになったため、他のアプリケーションでも機能しないことを意味します。

多くの場合、人々がアプリケーション デリゲートにデータを持ちたくなる理由は、[UIApplication sharedApplication].delegate. MVC の関係は必ずしも単純ではありません。たとえば、EditViewController も同じモデルにアクセスする必要があります。これを行うには、テーブル ビューと編集ビューの両方からモデルにアクセスできるようにするコードを記述する必要があります。アプリケーション デリゲートにデータがある場合は、アプリケーション デリゲートにアクセスすることで魔法のように配列にアクセスできるため、何もする必要はありません。

しかし、それだけです。ソフトウェア アーキテクチャを台無しにする代わりに、コーディング時間を数分節約できます。私は原理主義者ではありません。適切な形式のインターフェイスを提供する価値がないと確信している場合は、アプリケーション デリゲートを使用してデータを保存することがありますが、それはまれです。

では、テーブル ビュー コントローラーにマージされたデータに編集ビューをどのように接続すればよいのでしょうか? 複数の方法が考えられます。前に私が提案したのは、編集ビュー コントローラーがテーブル ビュー コントローラー ( delegate) への弱い参照を持ち、定義されたメッセージを送信することです- (void)editViewController:(EditViewController *editViewController) didFinishEditing:(id) someData。このように、同じプロトコルを使用している限り、この編集ビュー コントローラーを他のいくつかのビュー コントローラーと共に使用できます。しかし、他の人はそれのために異なるインターフェースを実装するかもしれません。

于 2011-02-22T05:11:44.453 に答える
1

その後、任意のビューコントローラーでデータを取得できるため、appDelegate に保存する必要があります。それがあなたを助けることを願っています。

幸運を

于 2011-02-22T05:10:08.573 に答える