感謝大家的關注,也給我一份動力,讓我繼續前進。有了自己的家庭有了孩子,過著上有老下有小的生活,能夠擠出點時間學習真的很難,每天弄好孩子睡覺已經是晚上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開發的不熟悉,學起來比較慢,另一方面確實是時間有限,現在估計下來,一個禮拜的寫一篇記錄應該是一個比較理想的計劃,本人儘力爭取不拖太長的時間,努力學習,謝謝各位的捧場!