こんにちは、私はすでに 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
クラスビューとコントローラーが相互にインポートし、コンパイラーが警告を表示するため、このバージョンは機能しません