三十而立,從零開始學ios開發(三):第一個有交互的app


感謝大家的關注,也給我一份動力,讓我繼續前進。有了自己的家庭有了孩子,過着上有老下有小的生活,能夠擠出點時間學習真的很難,每天弄好孩子睡覺已經是晚上10點左右了,然后再弄自己的事情,一轉眼很快就到12點了,就要去睡了,現在身體湯不牢啊,如果不早點睡,第二天上班肯定沒精神,要靠紅牛了,呵呵,在這樣的情況下再擠出時間學習ios真的很困難,只能是見縫插針,抓緊一切可用的時間學習,時間,擠一擠總歸是有的,只是多少問題。

這幾天看來書的第三章,主要講了如何添加按鈕,然后為按鈕添加響應事件,當點擊按鈕后,觸發按鈕的響應事件,從而改變一個Label上的顯示文字。如果這個放在VS里面,真的是小菜一疊,但是在ios里面,差別很大,很多東西第一次接觸會很混淆,下面就一點點介紹如何創建第一個有交互的app吧。

1)創建一個新的project,選擇“Single View Application”,命名為“Button Fun”,然后保存。


這里簡單的解釋一下什么是“Automatic Reference Counting”,簡稱ARC,是ios的一種垃圾回收機制,即自動釋放不再使用的變量,釋放內存,這個和C#中的垃圾回收有點類似,但是至於他們是如何實現的,就不是很清楚了,反正記住這個是用來自動釋放變量從而騰出內存空間的就可以了,暫時這么認為吧,以后用更深入的了解,再詳細描述。

2)添加2個Button和1個Label
選中project navigate中的“BIDViewController.xib”,添加Button的方法和上一篇中添加Label的方法一樣,直接從Object Library里面拖就可以,在Object Library中找到“Round Rect Button”

拖2個到界面中,添加完后的效果如下

上圖中,將2個button分別根據輔助線放到了屏幕的左右兩邊上下劇中的位置,Label放在最上面,然后將Label拉長,拉到出現輔助線的位置。

3)添加button文字,去除Label文字
在Xcode中,改變文字的方法有3種,第一種選中button,然后在Attributes Inspector中改變Title的屬性值
 
第二種方法是直接用鼠標在button上雙擊,然后鍵入需要的文字即可(這個和VS里面有很大的不同,在VS中雙擊一個按鈕是添加一個單擊事件,而在Xcode中,則是改變button的文字,所以說是VS比較簡單嘛)

第三種就是用代碼改變文字。

分別將左右兩個按鈕的文字改成“Left”和“Right”,使用同樣的方法,去除Label上的文字,並且在Attributes Inspector中將Label的文字對齊方式設置為劇中,最后的界面效果如下

4)Outlet和Action(這一小節的敘述不一定完全正確,只是本人的個人理解,如果有不對的地方,望大家能夠指出,謝謝!)
這兩個概念是我學習ios開發以來遇到的第一個難點,其實說難不難,就是很搞,一開始沒有理解它的意思。

Outlet:簡單來說就是C/C++里面的指針,指向一個對象,或者說是一個對象的引用,例如一個Label,一個Button等。在C# Winform中,我們會為每一個控件設定一個name,那么在編程時,直接使用這個name就可以對該控件進行操作,但是在ios里面,情況變得有些復雜,控件沒有name,就是說你拖一個控件過來,這個控件是沒有自己的name的,那么要在code中操作這個控件該怎么辦呢?定義一個Outlet,然后把這個Outlet指向該控件,在code中就用這個Outlet來操作這個控件,好吧,稍稍有些復雜。

舉兩個Outlet的例子:

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

以上僅僅是一個Outlet的定義,說明這個Outlet會指向一個Label控件,但是並沒有說明指向哪一個Label。

@property (weak, nonatomic) IBOutlet UIButton *leftButton;

同樣,上面僅僅是一個Outlet的定義,說明這個Outlet會指向一個Button控件,但是並沒有說明指向哪一個Button。

Action:相對於Outlet,Action應該稍微簡單一點,它的作用就是定義一個事件,然后將控件和Action事件聯系起來就可以。Action的例子如下:

- (IBAction)buttonPressed:(id)sender;

這個和C# Winform有點類似,C#可以單獨定義事件,然后將控件和事件使用“+=”操作符聯系起來就可以,雖然ios里面沒有這個語法,但是也是需要聯系的,聯系建立起來以后,控件就可以觸發這個事件了。

希望以上對Outlet和Action的簡單說說明大家能夠看懂,其實我自己也沒有百分百搞明白,先將自己的理解寫下,以后有更深入的理解后再進行補充。

5)為Button添加事件
前面說過了,要添加事件,首先要創建一個Action,然后建立聯系,Xcode比較智能,可以幫我們把這2步一起進行。
a)選中project navigator中的BIDViewController.xib,顯示iphone的界面。
b)選中Xcode右上角的7個按鈕從左到右的第二個Show Assistant editor(快捷鍵:option+command+enter,菜單欄View>Assistant Editor>Show Assistant editor)

選中后的界面如下,會在iphone界面的右邊出現BIDViewController.h文件,我們等會就要將button拖到這個文件里,然后進行一些相應的設置,Xcode就會自動幫我們建立控件和Action之間的聯系。
接下來就是創建Action了,鼠標選中Left按鈕不放,按住鍵盤上的control鍵,然后鼠標移動到右邊的BIDViewController.h文件上,在@interface和@end中間放開鼠標

(此圖從書上截取,所以不太清楚)
會有一個框彈出來,如下


將上面的值設置成下面的內容


首先,我們是創建一個Action,所以Connection選擇Action,然后為事件命名為buttonPressed,類型為UIButton,說明是按鈕事件,最后單擊“Connect”按鈕,完成創建。創建完成后的代碼如下:(BIDViewController.h)

#import <UIKit/UIKit.h>

@interface BIDViewController : UIViewController
- (IBAction)buttonPressed:(id)sender;

@end

在BIDViewController.m中會自動添加該事件的方法

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

為Left按鈕添加好Action后,再為Right按鈕添加同樣的事件,buttonPressed的參數sender可以區分是由哪個button觸發了該事件,所以我們不必再為Right button單獨的創建一個事件,直接將Right button關聯到buttonPressed就可以了,關聯的方法也很簡單,鼠標選中Right按鈕不放,按住鍵盤上的control鍵,然后鼠標移動到右邊的BIDViewController.h文件的buttonPressed事件上面,然后放開鼠標,關聯完成。
(此圖從書上截取,所以不太清楚)

 6)為Label添加Outlet
添加Outlet的方法和添加Action的方法一樣,只是在彈出框的參數選擇上略有區別,同樣,鼠標選中Label標簽,按住control,拖到BIDViewController.h文件中,放開鼠標后,一個彈出框彈出來

Connection保留默認值Outlet,Name中填寫“textStatus”作為Outlet的名稱,其他的選項都保留默認值即可,最后點擊“Connect”按鈕,Outlet創建完成。
創建完成后的代碼如下:(BIDViewController.h)

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

在BIDViewController.m中會自動添加@synthesize,然后在viewDidUnload方法中添加對textStatus的釋放代碼。(viewDidUnload方法是系統自動創建的,當該View釋放時調用,即該View將不顯示了,其他View要顯示時,該方法會調用到。)

@synthesize textStatus;
...
...
- (void)viewDidUnload
{
    [self setTextStatus:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

至此,所有的Action和Outlet都已經添加完畢,button可以觸發buttonPressed事件,textStatus指向Label,可以對Label進行操作。

7)寫Code
終於要開始寫代碼的,真心不容易啊。在BIDViewController.m的buttonPressed方法中添加以下代碼(其實也就2行而已)

- (IBAction)buttonPressed:(id)sender {
    NSString *title = [sender titleForState:UIControlStateNormal];
    textStatus.text = [NSString stringWithFormat:@"%@ button pressed.", title];
}

第一行:titleForState指的是按鈕在某個狀態時顯示的title,UIControlStateNormal得到的是按鈕的一般狀態,即按鈕沒有被點擊,沒有獲取焦點時的狀態,那么titleForState:UIControlStateNormal獲得的是按鈕在通常狀態下的title。
第二行:將title賦值給Label用於顯示。
兩行代碼很簡單易懂,沒有什么難點。

8)編譯運行
快捷鍵command+B,編譯程序。
快捷鍵command+R,運行程序。
當然,你也可以直接點Run按鈕,直接編譯運行程序。

程序運行后的開始效果如下

點擊Left按鈕,Label顯示“Left button pressed.”,點擊Right按鈕,Label顯示“Right button pressed.”

 

至此,整個程序開發完畢!

9)感謝
整個章節學習下來,發現有很多和Visual Studio不同的地方,事件、控件引用等都有比較大的差異,有比較的學習,可能會取得更快的進步,才能學得透徹,理解的更深入。當然,這只是一個開始,下一章,要學習更多的iphone上面的控件,下章再見!

 

Button_Fun.zip 



P.S. 這一篇學習筆記距離上一篇間隔了蠻長的時間,一是對iphone開發的不熟悉,學起來比較慢,另一方面確實是時間有限,現在估計下來,一個禮拜的寫一篇記錄應該是一個比較理想的計划,本人盡力爭取不拖太長的時間,努力學習,謝謝各位的捧場!

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM