0

私は最初のココア アプリにゼロから取り組んでおり、モデル、ビュー、およびコントローラーを連携させる方法について少し混乱しています。私は何か非常識なものを見逃していると確信しています。

基本的に、私のビューは現在、コントローラーに 3 つの値を返すように設定されています。コントローラーはこれらの値を受け取り、クラスの新しいインスタンスを作成します。これらのオブジェクトを配列に入れて、配列を操作できるようにしたいと考えています。

最初: 作成したい配列...それは私のモデルですよね? ビュー内のアクション (値の入力) がコントローラーによって正しく解釈され (オブジェクトの作成)、メソッドに格納されるようにするには、どのように、どこで作成すればよいですか?

2 番目: 私が行った試みにより、私はアレイから孤立したままになります。配列のクラスを作成しようとしましたが、コントローラーからアクセスできません。どうすればこれを回避できますか?

最後に: 私は数日間、コードに頭を悩ませてきました。私は独学で多くのことを学んでいますが、このような単純な質問がたくさんあります。お時間を割いていただきありがとうございます。)

編集:

Student クラスを作成しました。アクションはコントローラーに値を送信し、コントローラーは新しいインスタンスを作成します。
- (IBAction)addNewStudentButtonPressed:(id)sender
{
Student *newStudent = [[Student alloc] initNewStudentwithName:[nameField stringValue]
andID:[idField intValue]
andLevel:[levelField stringValue]];
}

配列はappDidFinishLaunchingメソッドで作成されています:
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSMutableArray *roster = [[NSMutableArray alloc] initWithCapacity:100];
}

そして今、学生を配列に追加したいと思います。明らかな何かが欠けているだけです。:(

4

2 に答える 2

0

モデルは、プログラムが扱っているもののアクティブな表現と考えてください。学生のリストを表示する必要がありますか? Student次に、一連のプロパティを持つクラスを設計する必要があります [既に行ったにおいがするように]。

コントローラーはユーザーとモデルの間のブリッジとして機能し、この接続がビューです。ビューでボタンを押すと、新しい生徒が作成され、配列に追加されます。

まず、配列が必要です。コントローラーにそのようなプロパティ/ ivar を提供します。この例では、ivar に固執します。

AppDelegate.h

@interface AppDelegate : NSObject <NSApplicationDelegate>
{

    //this is the array you will deal with inside Controller methods
    NSMutableArray* students;

    //you probably have some IBOutlets here:
    IBOutlet NSTextField* nameField;
    IBOutlet NSTextField* idField;
    IBOutlet NSTextField* levelField;

}

AppDelegate.m

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

    students = [[NSMutableArray alloc] initWithCapacity:100];

}

- (IBAction)addNewStudentButtonPressed:(id)sender
{

    Student *newStudent = [[Student alloc] initNewStudentwithName:[nameField stringValue]
    andID:[idField intValue]
    andLevel:[levelField stringValue]];

     //now you add the student to the array
    [students addObject: newStudent]

}

配列はロジックの一部ですが、モデル自体の一部ではありません。現時点ではコントローラーの基本フィールドにすぎません。もちろんClassroom、学生のリストを使用してクラスを定義すると、配列が別のエンティティ内にラップされます。

とにかく、MVC の問題は非常に緩く、多くの実装があります - 圧倒されないようにしてください。パターンが懸念を分離し、よりスムーズな開発を行うのに役立ちますが、それを教義とは考えないでください。

于 2012-08-29T14:51:03.250 に答える
0

さて、あなたは主に、モデル オブジェクトが格納されるコンテナの責任は誰にあるかを尋ねているようです。これは、長い議論を引き起こす可能性のある灰色の領域の 1 つですが、最も簡単な方法は、それをモデルの一部と見なすことです。これは、ほとんどの場合、ある時点でモデルを永続化する必要があり、アイテムごとに 1 つのファイルを作成するのではなく、コンテナー全体をファイルにストリーミングして、再び元に戻す可能性が高いためです。

それで、誰がこれを制御しますか?ドキュメント ベースのアプリの場合は、NSDocument サブクラスで行います。これは「モデル コントローラー」です (グレーの領域をうまくカバーします)。NSKeyedArchiver/NSKeyedUnarchiver を使用して、配列全体 (または辞書やその他のコンテナー) を読み書きするのと同じくらい簡単です。ドキュメント インスタンスはコンテナを保持し、UI コマンドとして Student インスタンスを追加/削除します。

非ドキュメント ベースのアプリでは、誰かがこのコンテナーを保持する必要があるため、これはアーキテクチャの問題です。最も簡単な方法は、それをアプリのデリゲート インスタンスに隠しておき、アプリの他の部分からその方法でアクセスするためのパス (アクセサー メソッドなど) を提供することです。「より良い」解決策は、学生の配列を管理する「StudentController」オブジェクトを持つことです。慣れてきたら、Cocoa Bindings と NSArrayController を見てください。それはあるものを単純化し、他のものを複雑にすることができますが、そのデザインは基本的な考え方です. バインディングはありませんが、StudentController オブジェクトはコンテナー (配列) を保持し、-addStudent: -removeStudent: および「アーカイブ/アーカイブ解除」関数を処理しますが、それらを処理したいと考えています。このようにして、 StudentController がすべての学生の中央ストア マネージャーになり、

Core Data を使用すると、基本的なケースでこれがさらに簡単になります。データ モデル (Student という名前の単一のエンティティ) を定義し、コードをまったく使用せずに学生を作成/挿入/編集できます。Core Data and Cocoa Bindings は、上で説明したアーキテクチャとそうでないアーキテクチャの一部を使用して、舞台裏ですべてを処理します。

より具体的な質問をすると、より具体的な答えが得られます。:-)

于 2012-08-29T14:39:49.430 に答える