2011-08-20 7 views
6

私はMVCで長時間働いていますが、このパターンをiOSで正しく使うことは保証されていません。iOSでMVCを使うにはどうすればいいですか

これは、私がモデルビューとコントローラの分割に使用する私の理解とソースコードです。

説明:

  1. モデル(例えば - クラスmymodelという) モデル、これは私のデータです。私は定義された計算のためにモデルを使用し、インターネットからのデータ取得を行い、さらにNSNotificationCenterを通じてモデルの変更についてコントローラに通知します。

  2. コントローラー(たとえば、クラスMyController) コントローラーはモデルデータの要求に直接連絡し、表示内の表示に直接移動できます。

  3. ビュー(たとえば、クラスMyView) ビュー - ユーザーからのイベントの表示と収集。ビューは、ターゲットアクションとデリゲートを介してコントローラとの対話を行うことができます。

コード:

クラスに、mymodel:NSObjectの

.h ... (some header code) 
    .m 
    Initialization method... 

    // method for get data from internet 
    -(NSData *)my_getDataFromInternet:(NSURL *)url{ 
     NSData *data=[NSData dataWithContentsOfURL:url]; 
     return data;  
    } 

クラスMyController:のUIViewController

 #import "MyView.h" 
    .h 
    MyView * my_view; 

    #import "MyData.h" 
    .m 
    Initialization method... 
    - (void)init{ 
     my_view = [[MyView alloc]init]; 
     my_view.my_target = self; 
     self.view = my_view; 
    } 

    -(void)mycontrolleraction{ 
     MyData * my_data = ... 
     [my_data my_getDataFromInternet:some_url_image]; 
     my_view.my_image = [UIImage imageWithData:self.my_data]; 
    } 

クラスMYVIEW:UIViewの

 .h 
    UIImage * my_image; 
    property(nonatomic, assign)id my_target; 
    .m 
    Initialization method... 
    - (void)initWithFrame{ 
     UIButton * my_button = ... 
     [button addTarget:my_target .... 
     my_image = ... 
     [self addSubview:my_image]; 
     [self addSubview:my_button]; 
     } 

私のボタンにターゲットを追加します - my_target(my_target - これはMyControllerです)。ユーザーがMyボタンをタップすると、MyControllerでメソッドが実行され、MyDataクラスのデータが要求されます。

私はMVCでこのメソッドを使用する私の間違いを知りたいと思います。

答えて

3

あなたは正しい考えを持っているようです。私は通常、モデルをデータを格納するだけでなく、それを操作するものと考えています。モデルをイメージを取得し、格納せずに戻すのはちょっと奇妙なようです。モデルをデータに保持させておくと、後で再度フェッチする必要がなくなりますが、間違っていない方法や、データがどこから来るのかは、モデル全体でなければなりません。

MVCに関係なく、私が示唆していることは、convention for initializersに従うことです。あなたの初期化メソッドは、スーパークラスの指定イニシャライザを呼び出す必要がありますので、あなたのコントローラの-initは、次のようになります。

-(id)init 
{ 
    if ((self = [super init])) { // double parens to avoid warning about = vs == 
     my_view = [[MyView alloc] init]; // assuming my_view is an ivar 
     my_view my_target = self; 
    } 
    return self; 
} 

同じことがあなたのビューとモデルクラスのために行きます。

+0

はい初期化でエラーが発生したことに同意します。これは、xcodeの代わりにサイトにすべてのコードを入力して少し上がったからです。私はこの単純な相互作用の例を、相互作用があるときに単に示すようにした。これは理想的なコードではなく、MVCでの簡単な除算の例です。あなたのコメントと私の質問への答えをありがとう。 –

関連する問題