斯坦福大学第二课学习笔记-MyFirstIosApp
本次视频主要是完成一个简易计算器的雏形,其中的知识点如下所示
- 学习storyborad中view层控件拖拽定义变量的用法(.h),控件拖拽定义方法的用法(.m)
- 学习了私有变量和方法的定义方式
- 学习了创建model的方法
- 学习几种常见的oc类
https://files.cnblogs.com/NeverLand-Lee/Caculator.zip
CalculatorBrain.h
1 #import <Foundation/Foundation.h> 2 简单定义两个共有方法 3 @interface CalculatorBrain : NSObject 4 -(void)pushOperand:(double)operand; 5 -(double)performOperation:(NSString*)operation; 6 7 @end
CalculatorBrain.m
#import "CalculatorBrain.h" @interface CalculatorBrain() 定义私有变量,可变数组 @property(nonatomic,strong) NSMutableArray* operandStack; @end @implementation CalculatorBrain
防止bug的写法 @synthesize operandStack = _operandStack; 重写它的get方法,在其中进行延迟初始化 -(NSMutableArray*) operandStack { //alloc the _operandStack if(_operandStack == nil){ _operandStack = [[NSMutableArray alloc]init]; } return _operandStack; } -(void)setOperandStack:(NSMutableArray *)operandStack { _operandStack = operandStack; } -(void)pushOperand:(double)operand {
将double类型转换为object类型,并放入数组 NSNumber* operandObject = [NSNumber numberWithDouble:operand]; //change operand to a object [self.operandStack addObject:operandObject]; } -(double)popOperand {
将数组的中的元素取出,并进行判断是否为空 NSNumber* operandObjct = [self.operandStack lastObject]; //make sure the array is not nil if (operandObjct) { [self.operandStack removeObject:operandObjct]; } return [operandObjct doubleValue]; } -(double)performOperation:(NSString*)operation {
进行操作数的判断,判断完成后进行计算,并且将计算结果压回数组,并且返回结果 double result = 0; if([@"+" isEqualToString:operation]){ result = [self popOperand] + [self popOperand]; }else if([@"*" isEqualToString:operation]){ result = [self popOperand] * [self popOperand]; } //push it to array for a loop [self pushOperand:result]; return result; } @end
CalculatorViewController.h
// // CalculatorViewController.h // Caculator // // Created by 建国 李 on 12-5-13. // Copyright (c) 2012年 __MyCompanyName__. All rights reserved. // #import <UIKit/UIKit.h> @interface CalculatorViewController : UIViewController
通过拖拽的方式定义的label,因为view上面已经是strong所以这里是weak,并且最好所有界面上的控件都是weak @property (weak, nonatomic) IBOutlet UILabel *display; @end
CalculatorViewController.m
// // CalculatorViewController.m // Caculator // // Created by 建国 李 on 12-5-13. // Copyright (c) 2012年 __MyCompanyName__. All rights reserved. // #import "CalculatorViewController.h" //import is in the .m file not .h file
引入model文件,注意并不是在.h文件中引入,而是在哪调用(一般为m文件)在哪引用
#import "CalculatorBrain.h" @interface CalculatorViewController () //private var decide the user is or not input
判断用户是否开始输入了
@property(nonatomic) BOOL userIsInTheMiddleOfEnterANumber;
定义一个私有的model对象 @property(nonatomic,strong) CalculatorBrain* brain; @end @implementation CalculatorViewController @synthesize display = _display; @synthesize userIsInTheMiddleOfEnterANumber; @synthesize brain = _brain; -(CalculatorBrain*)brain{
进行延迟初始化 if(!_brain){ _brain = [[CalculatorBrain alloc]init]; } return _brain; } - (IBAction)digitPressed:(UIButton*)sender { // [[self display] setText:[[[self display] text] stringByAppendingString:[sender currentTitle]]]; 当用户开始输入的时候,进行label数字叠加 NSString* dight = [sender currentTitle]; if(userIsInTheMiddleOfEnterANumber){ self.display.text = [self.display.text stringByAppendingString:dight]; }else { self.display.text = dight; self.userIsInTheMiddleOfEnterANumber = YES; } } - (IBAction)enterPressed {
用户点击erter按钮,将数字压入数组,并且将用户输入状态改为结束。 [self.brain pushOperand:[self.display.text doubleValue]]; self.userIsInTheMiddleOfEnterANumber = NO; } - (IBAction)operationPressed:(UIButton *)sender { //userIsInTheMiddleOfEnterANumber = yes
当用户输入完成数字的时候点击了操作符,帮助用户自动将数字装入数组
if(self.userIsInTheMiddleOfEnterANumber){ [self enterPressed]; }
调用model进行计算,并且将结果转换为string显示在label上。 double result = [self.brain performOperation:sender.currentTitle]; NSString* resultString = [NSString stringWithFormat:@"%g",result]; self.display.text = resultString; } @end
浙公网安备 33010602011771号