0%

iOS 5.0开发 第一个小程序:计算器

学习斯担福大学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