设计模式-Objective-C-MVC模型视图控制器 [英] Design Pattern - Objective-C - MVC Model View Controller
问题描述
您好,我已经阅读了有关MVC的网络教程,并且已经阅读了这里的主题.我想我有了MVC的概念,但是我不确定它的实现.
Hi I already read tutorials around the web on MVC and already read the topics on here. I think i got the concept of the MVC but i'm not sure of its implementation.
我试图将其应用于简单的程序,即具有标签和按钮的窗口. 该按钮将增加一个计数器,标签上将显示其值.
I've tried to apply it to a simple program, a window that have a label and a button. The button increase a counter and the label shows the value of it.
我尝试了2种不同的方式.
I tried in 2 different ways.
在第一种情况下(示例运行),我融合了View和Controller.正如我说的,该示例有效,但是我希望你们告诉我这是否是MVC的正确实现,还是没有遵循正确的设计.
In the first case ( the example works ) i melt the View and the Controller. As i said, the example works, but i want you guys to tell me if it's a correct implementation for MVC or it's not following the right design.
第二个示例将Model View和Controller作为3个单独的类,但是该示例不起作用,因为V和C本身会导入,所以我希望你们告诉我我在哪里做错了.
The second example has Model View and Controller as 3 separated class, but the example doesnt work because the V and the C import itself, so i would love you guys to tell me where i'm doing wrong.
第一个版本:模型,视图控制器
//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的方式来制作此应用程序的方式.不好吗好的?如何更改或修复它?
Is this way a correct Pattern for MVC ? The code works, but before i start more complex apps i want to make sure i code it in a good way. This is how i would do this app, my way of MVC. is it bad? good? how to change or fix it?
第二版:模型,视图,控制器分开
---->这是模型
//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
---->这是控制器
----> This is the Controller
//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
该版本无法正常工作,因为类视图和控制器会相互导入,并且编译器会向我发出警告
this version doesn't work because the classes view and controller import each other and the compiler gives me a warning
推荐答案
简单地说:UIViewController
不是您的视图,而是您的控制器
Simply: UIViewController
is not your view, it's your controller
-
UIViewController
控制UIView上显示的内容 -
UIView
的主要目的是包含子视图. -
NSObject
可由任何类使用,但应由UIViewController
使用.
UIViewController
controls WHAT is displayed on the UIViewUIView
's main purpose is to contain subviews.NSObject
can be used by any class, but should be used by theUIViewController
.
诚然,在完成codeschool的教程后,我对它的理解要好得多. http://www.codeschool.com /courses/try-ios .我强烈推荐这种简单的动手方法.
Admittedly, I understood it much better after completing codeschool's tutorial http://www.codeschool.com/courses/try-ios. I highly recommend this simple hands-on approach.
让我们分解一下:
注意:这里我们改用@property
声明.这些将使您不必编写自己的setter和getter方法. (除非您需要覆盖它们以实现自定义功能)
Note: Here we utilize @property
declarations instead. These will save you from writing your own setter and getter methods. (unless you need to override them for custom functionality)
//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
这篇关于设计模式-Objective-C-MVC模型视图控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!