2011-08-11 53 views
0

私はiPhone Notesアプリに似た作品を作っています。iPhone:どのコントローラがCRUDロジックを処理する必要がありますか?

私のアプリは2つの画面で構成されています。最初の画面はすべての記録を一覧表示するUITableViewです。 2番目の画面は、レコードの1つをクリックするか、追加ボタンをクリックすると表示されます。この2番目のビューには、ユーザーがそのレコードのテキストを追加/編集できるUITextViewが含まれています。

どちらの画面にもView Controllerがあります。 MyListViewControllerは、レコードをUITableViewにロードします。ユーザーがレコードをクリックすると、MyEditViewControllerのインスタンスを作成し、ナビゲーションコントローラのpushViewControllerメソッドを使用してプッシュします。

MyListViewController - > MyEditViewController

私の質問は、どのコントローラは、CRUDロジックを処理する必要がある、それは親コントローラ(すなわちMyListViewController)または編集コントローラ(すなわちMyEditViewController)すべきですか?

テーブルセルをスワイプして削除を選択すると、MyListControllerからレコードを削除できるはずです。

また、削除アイコンをクリックしてMyEditViewControllerから削除することもできます。

私は基本的にNotesアプリケーションを複製しようとしていますが、CRUDロジックをどこに置くべきかという点でベストプラクティスが不明です。

答えて

1

私は最近、非常によく似た要件を持つアプリケーションを開発しました。私はあなたのモデルについて非常に明確でなければならないと思う、&コントローラ。

モデルは、アプリケーションのUI以外の部分、場合によってはNotesの管理です。 NotesManagerというシングルトンオブジェクトを作成しました。共有インスタンスはコード内のどこからでもアクセスできます。 [NotesManager sharedInstance]のようなものです。私のアプリケーションでは、View Controllerはドキュメントディレクトリの内容を読み込み/列挙しません。なぜなら、NotesManagerはその仕事ではないからです。リストビューコントローラは、ノートマネージャにノートの表示を要求します。 [[NotesManager sharedInstance] notesFromDocsDir];

ビューはアプリケーションのUI部分です。この場合、ノートの編集ビュー&のテーブルビューになります。

コントローラは、ビュー&モデル間のリンクとして機能するものです。ご存知のように、ListViewController & EditViewControllerがあります。

は今、相互作用の2つのタイプがあります。

は最初のものは、UI &に由来するモデルを更新する必要があります。例えば、ユーザは、削除または保存をタップする。私のアプリケーションでは、私は[[NotesManager sharedInstance] deleteNote:Note]のような何かを行う。両方のViewコントローラからこれを行うことができます。

2番目はModel終了&のUIの更新に由来します。たとえば、私のアプリケーションでは、iTunesSharing &を有効にしているので、ユーザーはiTunes経由でメモを追加/削除できます。このようなイベントが発生すると、私のUIはドキュメントディレクトリの現在の状態を反映するように更新する必要があります。これを達成するために、NotesManagerはNSNotificationをディスパッチします。コントローラは、これらの通知を登録して、&がビューを更新します。

元の質問では、CRUDメソッドはNotesManagerにあります。これらは、何かが変更されたことを検出すると、コントローラまたはNotesManager自体によって呼び出すことができます。

HTH、

Akshay

+0

それはまさに私が探していた答えです。私はすでにこの結論に達していましたが、わからなかったので、あなたはそれをバックアップしましたので、私はこのルートを下るつもりです。 – Camsoft

+0

あなたがそれを気に入ってよかったです。 – Akshay

0

両方。そしてどちらも。

データを保存/提供するにはモデルを使用する必要があります。

のViewControllerの見解を制御して、変更を保存するためにモデルに指示を渡す必要があるなど

私がモデルにビジネスロジックを行うだろう - 単にviewcontrollersから、モデル内のメソッドを呼び出します。

あなたの子供のviewcontrollerが編集を行っているのを見ると、そのインスタンスのモデルに指示するものでなければなりません。

親ビューコントローラは、データの削除を処理するときにモデルに指示する必要があります。

0

私はあなたのモデルにこれらの操作をすべて実装することをお勧めします。 CRUD操作を扱うことができるNoteというクラスがあります。 NoteCollectionのように、テーブルビューに有効なデータを提供する必要があります。

MyEditViewControllerは、保存と削除のような操作を処理する必要がある単一のメモを常に処理します。これらはノートコレクションの状態を更新する必要があります。

+0

マイアプリは、ユーザーのドキュメントディレクトリ内のファイルを作成する必要があります。現在、MyListViewControllerはディレクトリ内のファイルを読み取り、Noteオブジェクトの配列を作成します。各ノートオブジェクトは基本的にタイトルとファイル名です。 私はNoteオブジェクトが私のモデルであると仮定していますか?作成、削除、更新メソッドはどこに置くべきですか? – Camsoft

4

説明するシナリオでは、使用するのに最適なパターンはデリゲートパターンです。

MyEditViewControllerの代理人を作成し、MyListViewControllerを委任するだけです。

デリゲートはプロトコルとして定義します。

@class MyEditViewController; 

@protocol MyEditViewControllerDelegate <NSObject> 
@required 
- (void)myEditViewController:(MyEditViewController *)controller didSaveNote:(BOOL)save; 
@end 

をして、既存のMyEditViewController.hコードにこれを追加します。だからあなたのMyEditViewController.hで、この中に入れました。あなたのMyEditViewController.mコードで

@interface MyEditViewController : UIViewController 
.... 
@property (nonatomic, retain) id <MyEditViewControllerDelegate> delegate; 
@end 

あなたは次のようなメッセージ送信、保存またはキャンセルボタン乗り切る押すとき:あなたに依存

[self.delegate myEditViewController:self didSaveNote:YES] 

または

[self.delegate myEditViewController:self didSaveNote:YES] 

保存またはキャンセル押しました。

@interface MyListViewController : UIViewController <MyEditViewControllerDelegate> 

とあなたのMyListViewController.mあなたは二つのことを覚えている中:ごMyListViewController.hあなたはこのようなあなたの新しく作成されたプロトコルを採用して

@implementation MyListViewController 
... 
- (void)myEditViewController:(MyEditViewController *)controller didSaveNote:(BOOL)save 
{ 
    // Do business logic here depending on the value of save 
} 

、最後のものは、このようなあなたのMyEditViewControllerのデリゲートにごMyListViewControllerを設定されています:必要なデリゲートメソッドを実装するには、まずあなたがMyListViewController内のすべてのCRUDロジックを処理する方法を

MyEditViewController *myEditViewController = [[MyEditViewController alloc] initWithNibNamed:@"MyEditViewController" bundle:nil]; 
[myEditViewController setDelegate:self]; 

とそうすれば、それに応じてテーブルビューを更新することができます。

+0

非常に素晴らしい詳細な答え。 +1。 –

+0

偉大な答えですが、モデルの作成を推奨する他の回答についてどう思いますか? – Camsoft

+0

私はあなたが決定したことを残しました。あなたが実装したビジネスロジックの種類について一度も言及していないからです。 CocoaのMVCフレームワークでは、常にモデルを使用することをお勧めしますが、データの格納方法によっては、モデルを使用する方法があります。 –

関連する問題