6

こんにちは、私はすでに MVC に関する Web のチュートリアルを読んでおり、ここのトピックも既に読んでいます。MVC の概念は理解できたと思いますが、その実装についてはわかりません。

単純なプログラム、ラベルとボタンを持つウィンドウに適用しようとしました。ボタンはカウンターを増加させ、ラベルはその値を示します。

私は2つの異なる方法で試しました。

最初のケース (例は機能します) では、View と Controller を溶かします。私が言ったように、この例は機能しますが、それが MVC の正しい実装なのか、それとも正しい設計に従っていないのかを教えてほしいです。

2 番目の例では、Model View と Controller が 3 つの別個のクラスとして含まれていますが、V と C 自体がインポートされるため、この例は機能しません。

最初のバージョン: モデル、ビュー コントローラー

//Model.h
#import <Foundation/Foundation.h>

@interface Model : NSObject {
    int _counter;
}

-(void)setCounter:(int)valueCounter;
-(int)getCounter;
-(void)increaseCounter;
@end

//Model.m
#import "Model.h"
@implementation Model {}

-(void)setCounter:(int)valueCounter { _counter = valueCounter; }
-(int)getCounter { return _counter; }
-(void)increaseCounter{ _counter ++; }
@end


//ViewController.h
#import <UIKit/UIKit.h>
#import "Model.h"

@interface ViewController : UIViewController {
    IBOutlet UIButton *_button;
    IBOutlet UILabel *_label;
    Model *myModel;
}

-(IBAction)send:(id)sender;
@end

//ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
     myModel = [[Model alloc]init];
    _label.text = [NSString stringWithFormat:@"%d",[myModel getCounter]];
}

- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; }

- (IBAction)send:(id)sender{
    [myModel increaseCounter];
    _label.text = [NSString stringWithFormat:@"%d",[myModel getCounter]];
}

@end



この方法は MVC の正しいパターンですか? コードは機能しますが、より複雑なアプリを開始する前に、適切な方法でコーディングしたことを確認したいと思います。これが私がこのアプリを行う方法であり、MVC の方法です。悪いですか?良い?それを変更または修正する方法は?




2 番目のバージョン: モデル、ビュー、コントローラーの分離

-> これはモデルです

//Model.h
#import <Foundation/Foundation.h>

@interface Model : NSObject {
    int _count;
}

-(void)setCount:(int)value;
-(int)getCount;
-(void)increaseCount;

@end

//Model.m
#import "Model.h"

@implementation Model

-(void)setCount:(int)value { _count = value; }
-(int)getCount { return _count; }
-(void)increaseCount { _count = _count++; }

@end

--> これがビューです

//View.h
#import <UIKit/UIKit.h>
#import "Controller.h"

@interface ViewController : UIViewController{
    IBOutlet UILabel *label;
    IBOutlet UIButton *button;
    Controller *myController;
}

@end

//View.m
#import "ViewController.h"
#import "Controller.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    myController = [[Controller alloc]init];
}

- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; }


-(IBAction)pressButton:(id)sender{
    label.text = [NSString stringWithFormat:@"%d",[myController actionIncrease]];
}

@end

-> これはコントローラーです

//Controller.m
#import <Foundation/Foundation.h>

@class "Model.h"
@class  "ViewController.h"

@interface Controller : NSObject {
    Model *_mymodel;
    UIViewController *_myviewController;
}

-(int)actionIncrease;

@end

//Controller.m
#import "Controller.h"
#import "Model.h"

@implementation Controller

-(id)init{
    _mymodel = [[Model alloc]init];
}

-(int)actionIncrease {
    [_mymodel increaseCount];
    return [_mymodel getCount];    
}

@end



クラスビューとコントローラーが相互にインポートし、コンパイラーが警告を表示するため、このバージョンは機能しません

4

2 に答える 2

27

単純に:UIViewControllerあなたのビューではなく、あなたのコントローラーです

UIViewControllerを操り人形師、 を操り人形と考えてくださいUIView

  • UIViewControllerUIView に表示されるものを制御します
  • UIViewの主な目的は、サブビューを含めることです。
  • NSObjectどのクラスでも使用できますが、UIViewController.

確かに、codeschool のチュートリアルhttp://www.codeschool.com/courses/try-iosを完了した後、私はそれをよりよく理解しました。このシンプルな実践的なアプローチを強くお勧めします。

それを分解しましょう:

注: ここでは@property代わりに宣言を使用します。これにより、独自のセッター メソッドとゲッター メソッドを作成する必要がなくなります。(カスタム機能のためにそれらをオーバーライドする必要がない限り)

NSObject (モデル):

//MyModelObject.h
#import <Foundation/Foundation.h>

@interface MyModelObject : NSObject

@property (nonatomic) int count; 

@end

UIView (ビュー):

//MyView.h
#import <UIKit/UIKit.h>

@interface MyView : UIView

// holds it's own subviews
@property (strong, nonatomic) UIView *anotherView;
@property (strong, nonatomic) UIImageView *myImageView;

@end

UIViewController (コントローラー、ここにすべてが集まっています!):

//MyViewController.h
#import <Foundation/Foundation.h>

#import "MyView.h"  // your custom view
#import "MyModel.h" // your custom model

@interface MyViewController : UIViewController

@property (strong, nonatomic) MyView *myView 
// see how the view is "owned" by the view controller?

@end



//MyViewController.m

@implementation MyViewController 

@synthesize myView;


- (void) someMethod {

    [myView doSomething]; 

}

@end
于 2013-08-01T00:48:32.387 に答える