设计模式-Objective-C-MVC模型视图控制器
大家好,我已经阅读了有关MVC的网络教程,并且已经阅读了这里的主题。我想我了解了MVC的概念,但我不确定它的实现 我尝试将其应用于一个简单的程序,一个有标签和按钮的窗口。 按钮增加计数器,标签显示计数器的值 我试过两种不同的方法 在第一种情况下(示例有效),我将视图和控制器融为一体。正如我所说,这个例子是可行的,但我想让你们告诉我,它是MVC的正确实现,还是没有遵循正确的设计 第二个例子将模型视图和控制器作为3个独立的类,但是这个例子不起作用,因为V和C本身导入,所以我希望你们告诉我哪里做错了 第一个版本:模型,视图控制器设计模式-Objective-C-MVC模型视图控制器,objective-c,model-view-controller,model,design-patterns,Objective C,Model View Controller,Model,Design Patterns,大家好,我已经阅读了有关MVC的网络教程,并且已经阅读了这里的主题。我想我了解了MVC的概念,但我不确定它的实现 我尝试将其应用于一个简单的程序,一个有标签和按钮的窗口。 按钮增加计数器,标签显示计数器的值 我试过两种不同的方法 在第一种情况下(示例有效),我将视图和控制器融为一体。正如我所说,这个例子是可行的,但我想让你们告诉我,它是MVC的正确实现,还是没有遵循正确的设计 第二个例子将模型视图和控制器作为3个独立的类,但是这个例子不起作用,因为V和C本身导入,所以我希望你们告诉我哪里做错了
//Model.h
#进口
@接口模型:NSObject{
内部计数器;
}
-(void)setCounter:(int)valueCounter;
-(int)getCounter;
-(void)递增计数器;
@结束
//m型
#导入“Model.h”
@实现模型{}
-(void)setCounter:(int)valueCounter{{u counter=valueCounter;}
-(int)getCounter{return_counter;}
-(void)递增计数器{u counter++;}
@结束
//ViewController.h
#进口
#导入“Model.h”
@界面ViewController:UIViewController{
IBUIU按钮*\U按钮;
IBUILABEL*\U标签;
模型*myModel;
}
-(iAction)发送:(id)发送方;
@结束
//ViewController.m
#导入“ViewController.h”
@界面视图控制器()
@结束
@实现视图控制器
-(无效)viewDidLoad{
[超级视图下载];
myModel=[[Model alloc]init];
_label.text=[NSString stringWithFormat:@“%d”,[myModel getCounter]];
}
-(void)didReceiveMemoryWarning{[super didReceiveMemoryWarning];}
-(iAction)发送:(id)发送方{
[myModel increaseCounter];
_label.text=[NSString stringWithFormat:@“%d”,[myModel getCounter]];
}
@结束
这是MVC的正确模式吗?代码是有效的,但在我启动更复杂的应用程序之前,我想确保我以良好的方式编写代码。这就是我将如何做这个应用程序,我的MVC方式。坏吗?好吗?如何更改或修复它
第二个版本:模型、视图、控制器分离 ---->这就是模型
//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
//Model.h
#进口
@接口模型:NSObject{
整数计数;
}
-(void)setCount:(int)值;
-(int)getCount;
-(无效)增加计数;
@结束
//m型
#导入“Model.h”
@实现模型
-(void)setCount:(int)value{u count=value;}
-(int)getCount{return\u count;}
-(void)递增计数{u计数=_计数++;}
@结束
---->这就是观点
//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
//View.h
#进口
#导入“Controller.h”
@界面ViewController:UIViewController{
IBUILABEL*标签;
IBUIButton*按钮;
控制器*myController;
}
@结束
//View.m
#导入“ViewController.h”
#导入“Controller.h”
@界面视图控制器()
@结束
@实现视图控制器
-(无效)viewDidLoad{
[超级视图下载];
myController=[[Controller alloc]init];
}
-(void)didReceiveMemoryWarning{[super didReceiveMemoryWarning];}
-(iAction)按按钮:(id)发送者{
label.text=[NSString stringWithFormat:@“%d”,[myController操作增加]];
}
@结束
---->这是控制器
//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
//Controller.m
#进口
@类别“Model.h”
@类“ViewController.h”
@接口控制器:NSObject{
模型*\u-mymodel;
UIViewController*\u myviewController;
}
-(int)行动增加;
@结束
//控制器
#导入“Controller.h”
#导入“Model.h”
@执行控制器
-(id)init{
_mymodel=[[Model alloc]init];
}
-(int)行动增加{
[_mymodelincreasecount];
返回[_mymodelgetcount];
}
@结束
此版本不起作用,因为类视图和控制器相互导入,编译器只给我一个警告:
UIViewController
不是您的视图,而是您的控制器
将UIViewController
视为木偶演员,将UIView
视为木偶。
控制UIView上显示的内容UIViewController
的主要目的是包含子视图UIView
可由任何类使用,但应由NSObject
使用UIViewController
@property
声明。这些将使您免于编写自己的setter和getter方法。(除非您需要为自定义功能覆盖它们)
NSObject(模型):
//MyModelObject.h
#进口
@接口MyModelObject:NSObject
@属性(非原子)整数计数;
@结束
UIView(视图):
//MyView.h
#进口
@接口MyView:UIView
//保存它自己的子视图
@属性(强,非原子)UIView*另一个视图;
@属性(强,非原子)UIImageView*myImageView;
@结束
UIViewController(控制器,这里所有的东西都在一起!):
//MyViewController.h
#进口
#导入“MyView.h”//您的自定义视图
#导入“MyModel.h”//您的自定义模型
@接口MyViewController:UIViewController
@属性(强,非原子)MyView*MyView
//查看视图是如何由视图控制器“拥有”的?
@结束
//MyViewController.m
@MyViewController的实现
@综合我的观点;
-(无效)某种方法{
[我的观点剂量测定];
}
@结束
对于那些对UI元素放在哪里有疑问的人,我通常喜欢将UI元素放在视图中。m
我的策略是生成View.m中构建UI元素的所有方法,其中我有一个方法调用View.m中的所有其他方法。因此,我只调用ViewController中的一个方法
例如:
TodayView.h
#导入
@接口TodayView:UIView
@性质(强,非原子)UIImag
//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
//MyModelObject.h
#import <Foundation/Foundation.h>
@interface MyModelObject : NSObject
@property (nonatomic) int count;
@end
//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
//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