我正在创建一个小的 MVC 示例项目作为 XCode 中的 iPhone 应用程序,它完全用代码构建,因此不使用 Interface Builder。首先,我想向您展示我目前拥有的代码。
控制器
控制器实例化模型和视图,还包含一个演示模型和视图之间独立性的函数:
视图控制器.h
#import <UIKit/UIKit.h>
#import "MainView.h"
#import "ProjectModel.h"
@interface ViewController : UIViewController
@end
视图控制器.m
#import "ViewController.h"
@interface ViewController ()
{
ProjectModel *model;
MainView *myMainView;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
model = [[ProjectModel alloc] init];
myMainView = [[MainView alloc] initWithFrame:CGRectMake(0, 0, 320, 468)];
[self.view addSubview:myMainView];
//test function to illustrate that view and model are independent
[self calculate];
}
- (void)calculate
{
int result = [model operationWithNumber:3 andAnotherNumber:5];
[myMainView showResult:result];
}
@end
模型
类 ProjectModel 负责项目的模型,在这个例子中为了简单起见只负责总结两个数字:
项目模型.h
#import <Foundation/Foundation.h>
@interface ProjectModel : NSObject
-(int)operationWithNumber:(int)number1 andAnotherNumber:(int)number2;
@end
项目模型.m
#import "ProjectModel.h"
@implementation ProjectModel
-(int)operationWithNumber:(int)number1 andAnotherNumber:(int)number2
{
return (number1 + number2);
}
@end
看法
视图类创建视图的所有元素并包含一个在标签中显示计算结果的函数。 主视图.h
#import <UIKit/UIKit.h>
@interface MainView : UIView
{
UILabel *lblResult;
}
- (void)showResult:(int)result;
@end
主视图.m
#import "MainView.h"
@implementation MainView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
UILabel *lblTitle = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 280, 50)];
lblTitle.text = @"This is my View";
[self addSubview:lblTitle];
lblResult = [[UILabel alloc] initWithFrame:CGRectMake(20, 200, 280, 50)];
lblResult.text = @"Result will be displayed here.";
[self addSubview:lblResult];
}
return self;
}
- (void)showResult:(int)result
{
lblResult.text = [NSString stringWithFormat:@"Resultat: %d", result];
}
@end
我的问题:
我希望你到目前为止已经理解了代码。基于上面的代码,我想在视图类中实现一个按钮,当用户点击这个按钮时,它应该计算并显示两个数字。因此,当用户单击按钮时,应调用 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 的主要目的是避免在同一个类中混合控制器和视图代码。
另外我想知道这段代码是否通常符合 Apple 传播的 MVC 模式,因为我对这种设计模式很陌生。我非常感谢您对此代码的简短反馈。