iPhone應用程序 Say Hello實例操作 (下篇)
iPhone應用程序 Say Hello實例操作 (下篇)是本節(jié)介紹的內(nèi)容,繼續(xù) iPhone應用程序 Say Hello實例操作 (中篇)的內(nèi)容開始介紹,先來看本節(jié)介紹。
實現(xiàn)視圖控制器
實現(xiàn)視圖控制器需要完成以下幾件事:
定義插座變量和動作方法,和Nib文件的視圖中的界面元素進行關(guān)聯(lián)
實現(xiàn)點擊按鈕后的相關(guān)邏輯——根據(jù)輸入的名字顯示相應的招呼語,判斷輸入的名字是不是為空是不是超長
用戶點擊鍵盤上的完成(Done)按鍵后,鍵盤會消失
建立連接
從業(yè)務角度來看,我們需要和界面的幾個元素建立關(guān)聯(lián):
文本輸入框,獲取它的輸入文字
文本標簽,讓它顯示特定文字
按鈕,響應它的點擊事件
在Xcode4之前,Interface Builder和Xcode是分開的,一般是先在Xcode中定義好插座變量和動作方法,然后再在InterfaceBuilder中去建立界面元素和視圖控制器之間的連接,到Xcode4之后,Interface Builder和Xcode已經(jīng)統(tǒng)一合并在了一起,所以這部分也有一些變化,Xcode4讓這部分工作變的更加容易一些,可以直接從視圖編輯界面拖動連接到代碼文件。
在我們正在開發(fā)的SayHello項目中,現(xiàn)在我們需要添加一個動作方法到視圖控制器,當界面上的按鈕被點擊時,它會發(fā)送一個sayHello:消息到視圖控制器,所以接下來要為按鈕創(chuàng)建一個sayHello:動作方法:
在Xcode中,選擇視圖控制器對應的Nib文件(RootViewController.xib)
讓Assistant顯示視圖控制器的頭文件(RootViewController.h)
按住Control鍵,從Nib文件中的按鈕拖動到頭文件的方法聲明代碼區(qū)域
在彈出的面板中,將按鈕和視圖控制器之間的連接設置為動作(Action)
設置 Connection 為 Action
設置 Name 為 sayHello:
設置 Type 為 id
設置 Event 為 Touch Up Inside,也就是用戶在點擊按鈕,然后釋放后觸發(fā)
設置 Arguments 為 Sender
點擊Connect建立連接
通過上面的為按鈕添加動作的操作,完成了兩件事
添加了相應的代碼到視圖控制器的類中
頭文件中增加了如下代碼:
- - (IBAction)sayHello:(id)sender;
并且實現(xiàn)文件中增加了相應的實現(xiàn)方法:
- - (IBAction)sayHello:(id)sender {
- }
IBAction 是一個特殊的關(guān)鍵字,它唯一的作用是告訴Interface Builder將某個方法當成目標/動作關(guān)聯(lián)中的動作。它被定義為void。
建立了按鈕到視圖控制器之間的連接。建立連接的意義,等同于在按鈕上調(diào)用 addTarget:action:forControlEvents: ,并且 target 是文件擁有者(File's Owner)也就是視圖控制器,action 是 sayHello: 方法,對應的事件是 UIControlEventTouchUpInside。
接下來要建立文本輸入框和文本標簽之間的連接:
在Xcode中,選擇視圖控制器對應的Nib文件(RootViewController.xib)
讓Assistant顯示視圖控制器的頭文件(RootViewController.h)
按住Control鍵,從Nib文件中的文本輸入框拖動到頭文件的方法聲明代碼區(qū)域
在彈出的面板中,將文本輸入框和視圖控制器之間的連接設置為插座(Outlet)
設置 Connection 為 Outlet
設置 Name 為 nameTextField
設置 Type 為 UITextField
點擊Connect建立連接
通過上面的為文本輸入框添加插座變量的操作,完成了兩件事
添加了相應的代碼到視圖控制器的類中
頭文件中增加了如下代碼:
- @property (nonatomic, retain) IBOutlet UITextField *nameTextField;
并且實現(xiàn)文件中增加了相應的實現(xiàn)方法:
在頂部增加了:
- @synthesize nameTextField;
在 dealloc 方法中添加了
- [nameTextField release];
在 viewDidUnload 方法中添加了:
- [self setNameTextField:nil];
IBOutlet是一個特殊的關(guān)鍵字,它唯一的作用是通知Interface Builder將某個實例變量或者屬性當成插座變量。實際上,這個關(guān)鍵字被定義為空白,因此在編譯的時候它沒有任何作用。
建立了文本輸入框到視圖控制器之間的連接。建立連接的意義,等同于在視圖控制器上調(diào)用 setNameTextFiled: 方法,將文本輸入框作為參數(shù)傳入。
按照上面創(chuàng)建文本輸入框插座變量相同的方法,再建立用來顯示問候語的文本標簽的插座變量,并且將插座變量命名為 greetingLabel,類型為 UILabel。
實現(xiàn)邏輯代碼點擊視圖中的按鈕,它會向視圖控制器發(fā)送 sayHello: 消息,之后,視圖控制器會取得文本輸入框文字內(nèi)容,根據(jù)內(nèi)容來更新用來顯示問候語的文本標簽的內(nèi)容。以下是RootViewController.m文件中 sayHello: 方法代碼的實現(xiàn):
- - (IBAction)sayHello:(id)sender {
- // 獲取文本輸入框內(nèi)容,并存儲到變量中
- NSString *nameString = nameTextField.text;
- // 檢查輸入的名字是否為空,如果為空,彈出提示信息
- if (nameString.length == 0) {
- UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"名字不能為空" message:@"請輸入名字后,重新點擊按鈕。
- " delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
- [alertView show];
- [alertView release];
- greetingLabel.text = @"";
- return;
- }
- // 檢查名字是不是超過16個字符,超過16個字符自動截斷
- if (nameString.length > 16) {
- nameString = [nameString substringToIndex:16];
- }
- // 根據(jù)輸入的名字,生成問候語
- NSString *greeting = [NSString stringWithFormat:@"你好,%@!", nameString];
- // 顯示問候語
- greetinggreetingLabel.text = greeting;
- }
對于這個方法有幾點補充說明:
UIAlertView是專門用來顯示消息提示對話框
stringWithFormat:方法符串按照格式化字符串所指定的格式創(chuàng)建一個新字符串。%@表明此處應該使用一個字符串對象來代替。
隱藏鍵盤編譯并運行應用程序。在文本框中輸入“Jim”,點擊按鍵后,標簽顯示“你好, Jim!” 。但是選擇文本字段進行輸入,您會發(fā)現(xiàn)您沒有辦法表示已完成輸入,也沒有辦法消除鍵盤。在iPhone應用程序中,當一個允許文本輸入的元素變成第一響應者時,鍵盤就會自動顯示出來,而當該元素不再處于第一響應者狀態(tài),鍵盤就會消失。我們不能直接向鍵盤發(fā)送消息,但是可以切換文本輸入元素的第一響應者狀態(tài),利用該操作的附加效果來顯示或消除鍵盤。在應用程序中,當用戶點擊文本字段時,該控件就會變成第一響應者,因此鍵盤就會顯示出來。而當用戶點擊鍵盤中的Done按鍵時,希望鍵盤消失。
UITextFieldDelegate協(xié)議包含一個textFieldShouldReturn:方法,一旦用戶點擊Return按鍵,文本字段就會調(diào)用該方法(和按鍵的標題無關(guān))。但將視圖控制器設置成文本輸入框(UITextField)的委托(Delegate),才可以實現(xiàn)該方法,在方法中向文本字段發(fā)送resignFirstResponder消息,這個消息的附加效果會讓鍵盤消失。
通過以下步驟設置文本輸入框的委托(delegate)連接:
在Xcode中,選擇視圖控制器對應的Nib文件(RootViewController.xib)
按住Control鍵,點擊文本輸入框
在彈出的半透明面板中,選中 delegate 后面的圓點,并拖動到 File's Owner
接下來,來實現(xiàn)將RootViewController作為文本輸入框nameTextField的委托(delegate)
在視圖控制器的頭文件(RootViewController.h)中,在UIViewController后面添加<UITextFieldDelegate>:
@interface RootViewController : UIViewController<UITextFieldDelegate> {
這個申明表示視圖控制器RootViewController將支持UITextFieldDelegate協(xié)議
在視圖控制器的實現(xiàn)文件(RootViewController.m),實現(xiàn) textFieldShouldReturn: 方法:
- - (BOOL)textFieldShouldReturn:(UITextField *)textField {
- if (nameTextField == textField) {
- [nameTextField resignFirstResponder];
- }
- return YES;
- }
因為這個應用程序只有一個文本輸入框,所以其實不需要包含nameTextField == textField檢查。不過有些時候,對象可能會被設置成多個相同類型的對象的委托,這時候就需要來區(qū)分這些對象。
至此我們已經(jīng)開發(fā)完成了整個應用程序。接下來將對它進行測試。
測試
這個應用程序相對簡單,我們設計幾個測試場景:
輸入正常的名字,例如“寶玉”,然后點擊按鈕,看看是不是會顯示“你好,寶玉!”
不輸入任何名字,點擊按鈕,看看是不是會有提示信息,要求輸入名字。
分別輸入16個、17個、20個字符的名字,看看名字是不是最多只能顯示前16個字符
點擊文本輸入框,顯示鍵盤,點擊鍵盤上的Done按鈕,看鍵盤是不是會隱藏
針對這個測試場景,逐一做一下功能的測試,看起來結(jié)果和我們預期的完全一樣。
小結(jié):關(guān)于iPhone應用程序 Say Hello實例操作 (下篇)的內(nèi)容介紹完了,希望本實例對你有所幫助。通過這樣一個簡單的項目,了解以下知識點: iOS開發(fā)常用的一些設計模式;iPhone程序的啟動過程;視圖控制器和Nib文件如何建立連接,這些知識對于iPhone開發(fā)和iOS開發(fā)來說,都是會經(jīng)常用到的知識。
本文來自:http://www.cnblogs.com/dotey/archive/2011/06/09/2075954.html