2

崇高なテキスト エディターの ruby​​ on rails から来た私のフォルダー レイアウトには、モデル、ビュー、およびコントローラー フォルダーがあり、何が何であるかを簡単に識別できました。

Objective-C では、フォローしている新しいチュートリアル用の新しいプロジェクトを作成しました。私はファイルを持っています:

BullsEyeViewController.h BullsEyeViewController.m BullsEyeViewController.xib

xibファイルがビューのようです。.h ファイルは宣言用であり、.m はそれらの宣言の実装用であることを知っています。これら 2 つのファイルはコントローラーとして分類されますか?

もしそうなら、どのようにモデルを識別しますか?大オタク牧場からの退屈だが必要な目的 c プログラミングの本を完成させましたが、目的 c の MVC に関してはまだ少し混乱しています。

私は今、別のコースをやっています。私が言ったようにRuby on Railsではモデルのビューとコントローラーを簡単に識別できますが、objective-cでしようとすると混乱し始めます。

xibはビューですか?しかし、その名前にviewcontrollerが含まれているため、少しひねります。これをすべて解決するための助けをいただければ幸いです。すべてのストレージを処理し、データベースと通信するファイルを作成したいとしましょう..ファイル名構造の観点からはどのように見えるでしょうか?

また、混乱を避けるために、appdelegate ファイルをサポート フォルダーに配置しました。私がやりたいのは、モデル、ビュー、およびコントローラーのフォルダーを作成し、関連するファイルをそれらの中に配置することです。

4

5 に答える 5

2

これは、iOS の MVC パラダイムについて、過去数週間で私が理解したことによるものです。iOS プログラミングの MVC デザイン パターンは、Objective C で実装された場合、他の言語とは少し異なるアプローチに従います。クラス BullsEyeViewController は、MVC パラダイムによるコントローラーです。.xib ファイルがビューです。Xcode は、プロジェクトの作成ウィンドウで指定したクラスに従って、ファイルに名前を付けるパターンに従います。モデル クラスは、アプリケーション ロジックを実装します。データベース管理のほとんどはコントローラーによって処理されます。MVC here に従うには、モデル クラスを別の方法で作成する必要があります。モデル クラスはコントローラーに通知します。コントローラーは、ビューとモデルを更新する仕事をします。ビュー内のユーザーアクションに応答します。

于 2013-09-14T20:28:37.620 に答える
1

「ビュー コントローラー」の「ビュー」と混同しないでください。

それは一般的にあなたの「コントローラー」です。xib ファイルまたはストーリーボードを使用している場合、通常はそれらが「ビュー」になります。

モデルは、明確に分離するために個別のファイルにする必要がありますが、多くのチュートリアルでは、モデルは「ビュー コントローラー」のコードで表され、通常は配列または辞書で構成されるデータ ストアになります。

学習時に混乱するのは、実際にはコード内にある「ビュー」コードを見つけるときです。[self.view addSubView:someOtherView] のようなコードと、UI 要素を作成し、それらのフレームやマスクなどを設定する多くのコードを見れば、通常、これを特定できます。

混乱させないでください。それらはおそらく別々のファイルにもあるはずですが、多くの場合、混在していません。「ビューコントローラー」にありますが、実際にはMVCの「V」です。

いくつかの例を読んだことを思い出しましたが、当時は知りませんでしたが、後で、それらが単一のビュー コントローラーで MVC 全体を表していることに気付きました。明らかに推奨されていませんが、これはかなり可能です。

混乱を招く可能性のあるその他の事項: クラス プロパティはモデルとして機能します。たとえば、25 枚の写真の配列。「View Controller」の横にあるネットワーク接続と写真の取得を行うコードを示す例を見つけることができますが、これは実際には「M」コードです。写真が取得されて保存されると、そのデータの所有者がモデルになります。正しい方法は、ネットワーク呼び出しを実行して写真をコントローラー (ビュー コントローラー) に返すようにクラスを設計し、UI (ビュー) を新しいデータで更新するメソッドを呼び出すことです。多くの場合、これはView Controllerに混在しており、完了ブロックを提供するネットワーク呼び出しのようなものが表示され、完了ブロックでビューのプロパティが更新されています。小さな「シーン」で そのネットワーク呼び出しがモデル データを取り込むための唯一の呼び出しである場合、コントローラー (ビュー コントローラー) にその単一のブロック ステートメントを含める方が実際には単純で効率的です。ただし、データを取得するために多くの呼び出しが行われる場合は、実際には独自のクラス ファイルに分離され、「M」になる必要があります。

ほとんどの IOS アプリでは、実際には、表示される「シーン」または新しいビューごとに新しい MVC を取得します。コントローラーは 1 つではなく、多数あります。私自身の言葉で言えば、IOS アプリには「コントローラーのコントローラー」という概念があるとも言えます。これらの例は、appDelegate、ナビゲーション コントローラー、タブバー コントローラー、分割ビュー コントローラーです。また、たとえば Core Data のようなモデル コントローラーを使用することもできます。これは、そのコンテキストを通じて多くのモデル オブジェクトを制御する 1 つの大きなコントローラーです。ストーリーボードは、考えてみれば、実際には単なるビューのコントローラーです。このような場合、各シーンに必要な特定のコントローラー、ビュー、およびモデル オブジェクトを取り出して、それらを接続します。

それが助けになり、これ以上の混乱を引き起こさないことを願っています。よくなって。

于 2013-09-16T01:54:55.710 に答える
1

これまで見てきたように、XCode は Rails とまったく同じ方法で MVC 構造を強制しません。Rails を使用してから数年が経ち、時代遅れかもしれませんが、覚えていることは次のとおりです。Rails プロジェクトを開始すると、データベース ファイルを提供できます。Rails はそれらを使用して、データベース ファイルを記述するモデル オブジェクトを生成します。データベース エンティティ、これらのモデル オブジェクトを表示/編集するためのビュー、およびモデルとビューを接続するためのコントローラー。

XCode で新しいシングル ビュー アプリケーションを作成しても、モデル ファイルは生成されません。プロジェクトを作成する前に、モデルがどのように見えるかを指定する機会が与えられないため、できません。知っているのは、ユーザーがビューを作成するということだけなので、そのビュー (.xib ファイル内) とそのビューのコントローラー (.h および .m ファイル内) を作成します。

.xib ファイルは、コントローラーにちなんで名付けられます。私はいつもこれが紛らわしいと思っていましたが、これは Apple が下した決定です。

XCode でのモデル作成をシミュレートするには、Core Data エディターに移動し、新しい Core Data Model を作成します (File -> New -> File -> Core Data -> Data Model)。このモデルに入力すると、作成したエンティティを選択し、[エディター] -> [NSManagedObject サブクラスの作成] に移動して、新しいモデル オブジェクトを記述するファイルを作成できます。これにより、記述したモデル オブジェクトをラップする .h および .m ファイルが生成されます。

もちろん、モデル オブジェクトは永続ストアによってサポートされている必要はありません。Core Data ルートに行かずに、新しいファイルを作成するだけです。しかし、XCode は Rails が行うディレクトリ構造を強制しません。すべての MVC ファイルを同じディレクトリにまとめることができます。必要に応じて、その構造を作成するのはあなた次第です。

xibはビューですか?しかし、その名前にviewcontrollerが含まれているため、少しひねります。

はい - 同意します。これは紛らわしいです。XCode は、コントローラ オブジェクトにちなんでビュー ファイル (.xibs) に名前を付けます。これは素晴らしいアプローチだとは思いませんが、これで終わりです。

つまり、XCode は、新しいビュー ファイルをプロジェクトに追加するたびに、自動的にビュー ファイルとコントローラー ファイルを作成します。Core Dataエディターを使用する場合を除いて、(私が知る限り)モデルファイルを明示的に作成することはありません。その場合でも、ファイル名に「モデル」を入れません。あなたが作成しました。

于 2013-09-15T19:25:58.273 に答える