Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设计模式-Objective-C-MVC模型视图控制器_Objective C_Model View Controller_Model_Design Patterns - Fatal编程技术网

设计模式-Objective-C-MVC模型视图控制器

设计模式-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本身导入,所以我希望你们告诉我哪里做错了

大家好,我已经阅读了有关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
视为木偶。
  • UIViewController
    控制UIView上显示的内容
  • 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