2019独角兽企业重金招聘Python工程师标准>>>

第二课名称是: My First iOS App 我的第一个iOS应用

注意:我用的是XCode Version 4.5.2 (4G2008a)版本,SDK 是6.0,和视频教程稍微不一样。

这课主要是以一个计算器一个用为例子,教你怎么使用XCode,如何使用MVC设计模式创建应用。

我们跟着他把应用做出来,这颗学习的目的就达到了。

1、新建一个single view application模版的应用

填写项目信息。

前缀加上 Calculator,新建的Viewcontroller前面都带有Calculator。选择了 使用故事版,使用ARC,这都是iOS 5.0之后的新特性。单元测试就不选了,后期才会去学。

接下来按他的演示,在故事版的View上放下一个Label控件,并调整位置和大小,如图:

创建outlet

好吧,老头继续把MVC模式的图放了出来:

为了说明Controller创建一个outlet到view, 如何操作呢?在Label按住上按住Control键,拖到.h文件,放开

要用weak指针,因为它已经在这个窗口上,有一个strong指针指向它了。所以只需要一个weak指针就行了。

@property (weak, nonatomic) IBOutlet UILabel *display;

IBOutlet 这个类型没有具体的内容,只是Xcode用来跟踪那个 property是Outlet。 编译器会忽略它,没有什么实际内容。

添加一些按钮。

Round Rect Button。

这就使用到了MVC的target -action,

在.m文件里生成了代码如下:

- (IBAction)digitPressed:(id)sender {
}

其实 IBAction什么都不是,只是让Xcode知道这是个aciton,事实上 IBAction是个void。
消息的参数 sender ,就是按钮自己,id是啥呢? 是个很总要的类型,可以指向任何类型对象的指针。

复制多个按钮,复制好之后改变按钮上的数字。

当你复制按钮的时候,也复制了它的target- action

修改代码:

- (IBAction)digitPressed:(UIButton *)sender {NSString *digit = [sender currentTitle];NSLog(@"digit pressed = %@", digit);
}

取得当前按下按钮的title,并在控制台打印出来。

运行程序看看,第一次运行比较慢,因为要预编译一些文件,读入framework等,第二次就快了。

在Label 上显示数字,添加代码如下:

- (IBAction)digitPressed:(UIButton *)sender {NSString *digit = [sender currentTitle];UILabel *myDisplay = self.display; //[self display];NSString *currentText = myDisplay.text; //[myDisplay text];NSString *newText = [currentText stringByAppendingString:digit];myDisplay.text = newText; //[myDisplay setText:newText];
}

后面注释的是另外一种写法,和.号的写法一个作用。

上面的代码可以缩减成这样:

- (IBAction)digitPressed:(UIButton *)sender {NSString *digit = [sender currentTitle];self.display.text = [self.display.text stringByAppendingString:digit];
}

小技巧,可以按住option键,点击某个方法或类,得到这个方法活类的文档。

增加+ - * /符号的按钮,增加Enter 按钮,参数是None:

建立一个model

新建文件,CalculatorBrain。它是计算器的大脑

把操作压入栈,完成栈上的操作。

@synthesize的实现getter setter的样子。

- (NSMutableArray *)operandStack
{if (_operandStack == nil) {_operandStack = [[NSMutableArray alloc] init];}return _operandStack;
}
- (void)setOperandStack:(NSMutableArray *)operandStack
{_operandStack = operandStack;
}

上面operandStack的实例化是延迟实例化 ,这个方式在iOS里经常用的。

这里是brain的.m文件和.h文件代码:

//
//  CalculatorBrain.m
//  Calculator
//
//  Created by rongfzh on 12-11-22.
//  Copyright (c) 2012年 rongfzh. All rights reserved.
//#import "CalculatorBrain.h"@interface CalculatorBrain()
@property (nonatomic, strong) NSMutableArray *operandStack;
@end@implementation CalculatorBrain
@synthesize operandStack = _operandStack;- (NSMutableArray *)operandStack
{if (_operandStack == nil) {_operandStack = [[NSMutableArray alloc] init];}return _operandStack;
}
- (void)setOperandStack:(NSMutableArray *)operandStack
{_operandStack = operandStack;
}- (void)pushOperand:(double)operand{[self.operandStack addObject:[NSNumber numberWithDouble:operand]];}-(double)popOperand
{NSNumber *operandObject = [self.operandStack lastObject];if (operandObject  != nil) {[self.operandStack removeLastObject];}return  [operandObject doubleValue];
}
- (double)performOperation:(NSString *)operation{double result = 0;if ([operation isEqualToString:@"+"]) {result = [self popOperand] + [self popOperand];}[self pushOperand:result];return result;
}
@end
#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject
- (void)pushOperand:(double)operand;
- (double)performOperation:(NSString *)operation;
@end

里面的具体的解释看老头讲解吧。主要的流程是把操作数放到栈里,按下操作符时取出操作数进行相应的运算。这节课实现了+法。

controller的代码实现:

#import "CalculatorViewController.h"
#import "CalculatorBrain.h"@interface CalculatorViewController ()
@property (nonatomic) BOOL userIsInTherMiddleOfEnteringANumber;
@property (nonatomic , strong) CalculatorBrain *brain;
@end@implementation CalculatorViewController@synthesize brain = _brain;- (CalculatorBrain *)brain
{if (!_brain) {_brain = [[CalculatorBrain alloc] init];}return _brain;
}
- (void)viewDidLoad
{[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.
}- (void)didReceiveMemoryWarning
{[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}- (IBAction)digitPressed:(UIButton *)sender {NSString *digit = [sender currentTitle];if (self.userIsInTherMiddleOfEnteringANumber) {self.display.text = [self.display.text stringByAppendingString:digit];}else{self.display.text = digit;self.userIsInTherMiddleOfEnteringANumber = YES;}
}- (IBAction)operationPressed:(UIButton*)sender
{if (self.userIsInTherMiddleOfEnteringANumber) {[self enterPressed];}double result = [self.brain performOperation:sender.currentTitle];NSString *resultString = [NSString stringWithFormat:@"%g", result];self.display.text = resultString;
}- (IBAction)enterPressed {[self.brain pushOperand:[self.display.text doubleValue]];self.userIsInTherMiddleOfEnteringANumber = NO;
}
@end

运行结果:

课程代码下载:http://download.csdn.net/detail/totogo2010/4798557

容芳志 (http://blog.csdn.net/totogo2010)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载于:https://my.oschina.net/201003674/blog/288767

2011斯坦福大学iOS应用开发教程学习笔记(第二课)My First iOS App相关推荐

  1. 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C

    2011年冬季斯坦福大学公开课 iOS应用开发教程是个很经典的教程,这个老头讲的很给力.做笔记总结. 第一课名称: MVC and Introduction to Objective-C 这课的主要内 ...

  2. 2011斯坦福大学iOS应用开发教程学习笔记(第七课)Pad和iPhone的通用程序

    第七课的主要内容:iPad 和iPhone的通用程序 这节课主要讲如何在一个程序里适配iPad 和iPhone. 内容简介 1.UIToolbar上面放的都是UIBarButtonItem 可以参考i ...

  3. 2011斯坦福大学iOS应用开发教程学习笔记(第六课)故事版

    第六课 主要内容:多个MVC的程序和故事版.UINavigationController. Segues 1.多个MVC 前面的程序都是一个MVC,多个View时,怎么办,那就需要多个Controll ...

  4. 斯坦福大学iOS应用开发教程学习笔记(第七课)Pad和iPhone的通用程序

    第七课的主要内容:iPad 和iPhone的通用程序 这节课主要讲如何在一个程序里适配iPad 和iPhone. 内容简介 1.UIToolbar上面放的都是UIBarButtonItem 可以参考i ...

  5. 斯坦福大学iOS应用开发教程学习笔记(第六课)故事版 StoryBoard

    第六课 主要内容:多个MVC的程序和故事版.UINavigationController. Segues 1.多个MVC 前面的程序都是一个MVC,多个View时,怎么办,那就需要多个Controll ...

  6. iOS 11开发教程(三)运行第一个iOS 11程序

    iOS 11开发教程(三)运行第一个iOS 11程序 运行iOS11程序 创建好项目之后,就可以运行这个项目中的程序了.单击运行按钮,如果程序没有任何问题的话,会看到如图1.6和1.7的运行效果. 图 ...

  7. iOS 11开发教程(二)编写第一个iOS 11应用

    iOS 11开发教程(二)编写第一个iOS 11应用 编写第一个iOS 11应用 本节将以一个iOS 11应用程序为例,为开发者讲解如何使用Xcode 9.0去创建项目,以及iOS模拟器的一些功能.编 ...

  8. Cocos Creator游戏开发教程 学习笔记

    学完提问几个问题吧: position的锚点位置数值原点在哪里? 因为position是相对坐标,所以原点是父节点的锚点 .所以Canvas下面的直属节点原点就是世界坐标系的原点Canvas的锚点. ...

  9. 二十一世纪大学英语读写基础教程学习笔记(原文)——5 - Shipwrecked in Antarctica(沉船南极洲)

    Unit 5 - Shipwrecked in Antarctica(沉船南极洲) Ernest Shackleton made many great achievements in his life ...

最新文章

  1. cam350 不能打开光绘文件_电子设计工程CAM350光绘工艺的一般流程
  2. 华睿相机sdk 开发_索尼发布相机远程操作SDK(软件开发工具包)
  3. python scheduler 定时执行_python使用apscheduler做定时任务的管理
  4. 聊聊高并发(二十九)解析java.util.concurrent各个组件(十一) 再看看ReentrantReadWriteLock可重入读-写锁...
  5. android层叠卡片特效_LINE生日贺卡功能升级 快来试试私人生日贺卡 气球祝福特效...
  6. vue怎么实现手风琴效果_Vue中使用v-for制作动态手风琴效果
  7. vb.net加密解密方法
  8. Linux驱动开发必看
  9. html table自动序号,layui 给数据表格加序号的方法
  10. 源码时代软测干货分享|带你了解CGI支持模块
  11. pentaho SPARK
  12. 《大数据时代》 概要
  13. JSON解析工具----JSONPath基本使用
  14. 关于倾斜测量中的“无感惯导”
  15. 多变量线性回归(机器学习笔记三)
  16. c语言编程六度空间,六度空间理论的图论法证明及应用
  17. 如何在国内完成个人建站
  18. 通用后台管理系统(2)-项目搭建
  19. 使用DL模型预测台风/雷达回波/降水的datasets构建学习笔记
  20. ffmpeg 转换flv压缩大小_简单几步教你怎样使用FFmpeg工具快速的转换FLV视频为MP4格式...

热门文章

  1. SNF平台从sql server兼容oracle的处理方式和开发方式
  2. FPGA机器学习之stanford机器学习第三堂1
  3. DEDE文章列表加上序号效果
  4. T-sql检测文件夹是否存在
  5. clear在CSS中的妙用
  6. 傅里叶变换和逆傅里叶变换numpy
  7. 一种新的图像清晰度评价函数,数字图像清晰度评价函数的研究与改进
  8. 如何修改MFC的图标
  9. MFC VC 双缓冲绘图基本原理与实现,详细解释
  10. C++中重载与重写函数区别及虚函数(转载)