第二課名稱是: 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 {
- }
消息的參數 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)
本文遵循“署名-非商業用途-保持一致”創作公用協議