gpt4 book ai didi

objective-c - 设计模式 - Objective-C - MVC Model View Controller

转载 作者:太空狗 更新时间:2023-10-30 03:46:25 26 4
gpt4 key购买 nike

您好,我已经在网上阅读了有关 MVC 的教程,并且已经阅读了此处的主题。我想我了解了 MVC 的概念,但我不确定它的实现。

我已经尝试将它应用于一个简单的程序,一个带有标签和按钮的窗口。按钮增加一个计数器,标签显示它的值。

我尝试了两种不同的方式。

在第一种情况下(示例有效),我融化了 View 和 Controller 。正如我所说,该示例有效,但我希望你们告诉我它是否是 MVC 的正确实现,或者它没有遵循正确的设计。

第二个示例将 Model View 和 Controller 作为 3 个独立的类,但该示例不起作用,因为 V 和 C 导入了自身,所以我希望你们能告诉我哪里做错了。

第一个版本:模型, View Controller

//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 方式。不好吗?好的?如何更改或修复它?




第二个版本:模型、 View 、 Controller 分离

---->这是模型

//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

//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

//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



这个版本不起作用,因为类 View 和 Controller 相互导入,编译器给我一个警告

最佳答案

简单地说:UIViewController 不是您的 View ,而是您的 Controller

UIViewController 视为木偶操纵者,将 UIView 视为木偶。

  • UIViewController 控制 UIView 上显示的内容
  • UIView 的主要目的是包含 subview 。
  • NSObject 可以被任何类使用,但应该被 UIViewController 使用。

诚然,在完成 codeschool 的教程后,我对它的理解要好得多 http://www.codeschool.com/courses/try-ios .我强烈推荐这种简单的动手方法。

让我们分解一下:

注意:这里我们使用 @property 声明来代替。这些将使您免于编写自己的 setter 和 getter 方法。 (除非您需要覆盖它们以实现自定义功能)

NSObject(模型):

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

@interface MyModelObject : NSObject

@property (nonatomic) int count;

@end

UIView( View ):

//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( Controller ,一切都在这里!):

//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 - 设计模式 - Objective-C - MVC Model View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17971272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com