Objective c iOS—无接口生成器的MVC模式实现

Objective c iOS—无接口生成器的MVC模式实现,objective-c,model-view-controller,Objective C,Model View Controller,我正在XCode中创建一个小MVC示例项目作为iPhone应用程序,它完全是用代码构建的,因此不使用Interface Builder。首先,我想向您展示我目前掌握的代码 控制器 控制器实例化模型和视图,还包含一个函数,该函数演示了模型和视图之间的独立性: ViewController.h #import <UIKit/UIKit.h> #import "MainView.h" #import "ProjectModel.h" @interface ViewController :

我正在XCode中创建一个小MVC示例项目作为iPhone应用程序,它完全是用代码构建的,因此不使用Interface Builder。首先,我想向您展示我目前掌握的代码

控制器 控制器实例化模型和视图,还包含一个函数,该函数演示了模型和视图之间的独立性:

ViewController.h

#import <UIKit/UIKit.h>
#import "MainView.h"
#import "ProjectModel.h"

@interface ViewController : UIViewController

@end
#import <Foundation/Foundation.h>

@interface ProjectModel : NSObject

-(int)operationWithNumber:(int)number1 andAnotherNumber:(int)number2;

@end
#import <UIKit/UIKit.h>

@interface MainView : UIView
{
    UILabel *lblResult;
}

- (void)showResult:(int)result;

@end
模型 ProjectModel类负责项目的模型,在本例中,为了简单起见,它只负责总结两个数字:

ProjectModel.h

#import <UIKit/UIKit.h>
#import "MainView.h"
#import "ProjectModel.h"

@interface ViewController : UIViewController

@end
#import <Foundation/Foundation.h>

@interface ProjectModel : NSObject

-(int)operationWithNumber:(int)number1 andAnotherNumber:(int)number2;

@end
#import <UIKit/UIKit.h>

@interface MainView : UIView
{
    UILabel *lblResult;
}

- (void)showResult:(int)result;

@end
看法 view类创建视图的所有元素,并包含一个在标签中显示计算结果的函数。 MainView.h

#import <UIKit/UIKit.h>
#import "MainView.h"
#import "ProjectModel.h"

@interface ViewController : UIViewController

@end
#import <Foundation/Foundation.h>

@interface ProjectModel : NSObject

-(int)operationWithNumber:(int)number1 andAnotherNumber:(int)number2;

@end
#import <UIKit/UIKit.h>

@interface MainView : UIView
{
    UILabel *lblResult;
}

- (void)showResult:(int)result;

@end
我的问题: 我希望到目前为止您理解了代码。基于上面的代码,我想在view类中实现一个按钮,当用户单击这个按钮时,它应该计算并显示两个数字。因此,当用户单击按钮时,应调用ViewController中的计算函数。我在MainView.m中创建了一个按钮,其代码如下:

UIButton *btnCalculate = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btnCalculate setFrame:CGRectMake(20, 90, 280, 50)];
[btnCalculate setTitle:@"Calculate" forState:UIControlStateNormal];
[btnCalculate addTarget:self action:@selector(calculate:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btnCalculate];
问题在于上面代码中的这一行:

[btnCalculate addTarget:self action:@selector(calculate:) forControlEvents:UIControlEventTouchUpInside];
如何从控制器添加功能作为按钮的操作。我知道目标不应该是self,因为该函数应该在ViewController中调用,但我不知道如何才能做到这一点。谁能帮我一下,告诉我怎么解决这个问题

我现在看到的唯一解决方案是直接在ViewController中创建完整的GUI。但我认为这不是一个好的解决方案,因为MVC的主要目的是避免在同一个类中混合使用控制器和视图代码


另外,我想知道这段代码是否符合苹果公司传播的MVC模式,因为我对这种设计模式还很陌生。我非常感谢对这段代码的简短反馈。

不要在view类中设置目标。对于MVC,视图不应该明确知道控制器。视图类应该有一个公开按钮的公共属性,然后控制器可以更新按钮以添加目标

除此之外,您似乎理解MVC的意义


这行确实有点混淆了
[self.view addSubview:view]因为它似乎试图将视图添加为自身的子视图…

MVC模式是一件好事,但我认为像您这样的程序没有必要有这样的分离程度。按钮也可以在view类中,因为它是该模式以及计算函数的一部分。

这一行听起来确实有点奇怪。视图是MainView的一个实例,它被添加到ViewController的视图中,因此它会被实际显示。也许我应该叫它myMainView或类似的东西。我会在我的开场白中改变这一点。您的解决方案听起来很有趣,我会尝试一下。是的,将视图称为不同的视图,因为视图控制器已经具有
view
属性。我实现了您的解决方案,将MainView中的按钮设置为公共,并将此语句添加到ViewController:[myMainView.btnCalculate addTarget:self action:@selector(calculate:)forControlEvents:UIControlEventTouchUpInside];它很管用,看起来很不错。谢谢你的帮助!是的,对于这种项目,MVC模式是不必要的。这个项目只是以一种简单易懂的方式向社区展示我的想法和想法。到目前为止,我在ViewController中对所有内容(控制器、模型和视图)进行了编码,结果导致应用程序在这一个且唯一的文件中出现了未发送的代码行,这让人非常困惑。这就是我想学习这种设计模式的原因。我不确定是否有一种精确的方法来真正区分一切,我相信可能有。你肯定是对的,很多程序都有很粗的视图控制器,事实上,苹果的一些示例也有,不仅仅是我们。