学习斯担福大学2011年秋季iOS 5.0开发视频教程第二课写的,目前没中文字幕,大学英语四级没过的人伤不起,英文字幕加Google翻译。 最终效果图: 与视频教程中的代码稍有不同,那个每输入一个数字,要按enter确认,没看完视频教程的时候,我一直搞不明白为什么要那么写,看完了才知道。 新建Single View Application项目Calculator,类前缀Calculator CalculatorAppDelegat两个文件均为自动生成未修改。 新建一个Objective-C Class,名为CalculatorBrain,这个就是MVC模式中的Model,所有的数据处理都在这里,CalculatorViewController取到数据后,作简单的转换以符合Model的要求,再传给Model,由Model处理完返回处理结果给Controller,再由Controller更新View. CalculatorBrain.h
//
// CalculatorBrain.h
// Calculator
//
// Created by fhp on 12-2-17.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
#import
@interface CalculatorBrain : NSObject
-(void)operate:(double) num1:(NSString *) operaString;
//接收第一个数字和操作符
-(double)calculate:(double) num2;
//接收第二个数字,并计算,返回计算结果
@end
CalculatorBrain.m
//
// CalculatorBrain.m
// Calculator
//
// Created by fhp on 12-2-17.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
#import "CalculatorBrain.h"
@interface CalculatorBrain()
//定义私有属性
@property (nonatomic) double result;
//储存执行结果
@property (copy,nonatomic) NSString * tempOperaString;
//存储操作符
@end
@implementation CalculatorBrain
@synthesize result=_result,tempOperaString=_tempOperaString;
-(void)operate:(double) num1:(NSString *) operaString
{
_result=num1;
_tempOperaString=operaString;
}
-(double)calculate:(double) num2
{
//根据操作符执行相应的计算
if([_tempOperaString isEqualToString:@"+"])
{
_result+=num2;
}else if([_tempOperaString isEqualToString:@"-"])
{
_result-=num2;
}else if([_tempOperaString isEqualToString:@"*"])
{
_result*=num2;
}else if([_tempOperaString isEqualToString:@"/"])
{
if (num2==0) {
_result=0;
}else{
_result/=num2;
}
}
return _result;
//返回结果
}
@end
CalculatorViewController.h
//
// CalculatorViewController.h
// Calculator
//
// Created by fhp on 12-2-17.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
#import
@interface CalculatorViewController : UIViewController
- (IBAction)digiPressed:(id)sender;
//数字键按下操作
- (IBAction)operatePressed:(id)sender;
//操作符按下操作
- (IBAction)enterPressed:(id)sender;
//等于号按下操作
@property (weak, nonatomic) IBOutlet UILabel *display;
//显示输入和结果的属性
@end
CalculatorViewController.m
//
// CalculatorViewController.m
// Calculator
//
// Created by fhp on 12-2-17.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
#import "CalculatorViewController.h"
#import "CalculatorBrain.h"
@interface CalculatorViewController()
//把私有的方法和属性定义在这
@property (nonatomic) BOOL isEntering;
//数字输入的状态,指明之前是否正在输入数字
@property (strong,nonatomic) CalculatorBrain * brain;
//Model,CalculatorViewController是一个Controller,
//为了符合MVC模式,需要把数据传送给Model,即这里的CalculatorBrain类处理,CalculatorBrain
//返回计算结果给CalculatorViewController
@end
@implementation CalculatorViewController
@synthesize display = _display;
@synthesize isEntering=_isEntering;
@synthesize brain=_brain;
-(CalculatorBrain *) brain
{
//重写brain属性的getter方法,在该方法中初始化CalculatorBrain实例
if(!_brain)_brain=[[CalculatorBrain alloc] init];
return _brain;
}
- (void)viewDidUnload
{
[self setDisplay:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (IBAction)digiPressed:(UIButton *)sender {
//按到数字键时执行
if(self.isEntering==YES)
{
//如果之前已经是在输入的状态
if([_display.text length]<12)
{
//如果之前输入的数字少于12位
self.display.text = [self.display.text stringByAppendingString:[sender currentTitle]];
//把按到的数字转成字符串加到原来显示的字符串的未尾,并更新显示
}else{
//如果输入的数字大于等于12位,不操作,直接返回
return;
}
}else{
//如果之前不是输入状态,即现在输入的是数字的第一位(最高位)
self.display.text=[sender currentTitle];
//显示输入的数字
self.isEntering=YES;
//把输入状态改为YES
}
}
- (IBAction)operatePressed:(UIButton *)sender {
//操作符被按下时执行
self.isEntering=NO;
// 把输入状态改为NO
double num=[self.display.text doubleValue];
//取到显示的数字,转换为double
[self.brain operate:num :[sender currentTitle]];
//把数字和操作符发送给CalculatorBrain的opera接收器
}
- (IBAction)enterPressed:(id)sender {
//等号键被按下
self.isEntering=NO;
//把输入状态改为NO
double num=[self.display.text doubleValue];
//取到显示的数字,转换为double
double result=[_brain calculate:num];
//把数字发送给CalculatorBrain的calculate接收器,并接收返回的结果
self.display.text=[NSString stringWithFormat:@"%g",result];
//把结果显示在屏幕上
}
@end