下一頁 上一頁
實施視圖控制器
實施視圖控制器包括這幾部分:為使用者姓名添加屬性,實施
changeGreeting:
方法,確定使用者輕按“Done”時鍵盤消失。
為使用者姓名添加屬性
您需要為儲存使用者姓名的字元串添加屬性聲明,這樣您的代碼就總能引用該字元串。因為此屬性必須是公共的,即對用戶端和子類為可見,是以須将此聲明添加到視圖控制器的頭檔案,即
HelloWorldViewController.h
。公共屬性表示您打算如何使用這一類的對象。
屬性聲明是一個指令,它告訴編譯器如何為變量(例如用來儲存使用者姓名的變量)生成存取方法。(添加屬性聲明後,您将了解到有關存取方法的資訊。)
到此為止,不需要對串聯圖檔案做出任何進一步的修改。要騰出更多空間以按照以下步驟來添加代碼,請再次點按“Utilities View”按鈕來隐藏實用工具區域(或者選取“View”>“Utilities”>“Hide Utilities”)。
為使用者姓名添加屬性聲明
- 在項目導航器中,選擇
。HelloWorldViewController.h
- 在
語句前,為字元串編寫一個@end
@property
語句。
屬性聲明應該是這樣的:
可以拷貝和粘貼以上代碼,也可以在編輯器面闆中鍵入以上代碼。如果您決定鍵入代碼,請注意 Xcode 會根據鍵入内容提供自動補齊的建議。例如,開始鍵入@property (copy, nonatomic) NSString *userName;
Xcode 猜測您想要鍵入@prop...
,是以會在内聯建議面闆中顯示這樣一個符号(如下圖所示):@property
如果建議合适(如上述示例所示),則按下 Return 鍵接受建議。
随着您繼續鍵入,Xcode 可能提供一個建議清單供您選取。例如随着您鍵入
,Xcode 可能顯示如下補齊清單: Xcode 顯示補齊清單時,按下 Return 鍵以接受高亮顯示的建議。如果高亮顯示的建議不正确(如上圖所示清單),可使用箭頭鍵從清單中選擇合适的項目。NSStr...
編譯器自動為您聲明的任何屬性合成存取方法。存取方法是一種擷取或設定一個對象的屬性的值的方法(是以,存取方法有時也稱為“getter”和“setter”)。例如,編譯器為剛剛聲明的
userName
屬性生成以下的 getter 和 setter 聲明及其實作:
-
- (NSString *)userName;
-
- (void)setUserName:(NSString *)newUserName;
編譯器也自動聲明專有執行個體變量以支援每一個經聲明的屬性。例如,編譯器聲明名為
_userName
的執行個體變量以支援
userName
屬性。
注:編譯器将生成的存取方法添加到編譯代碼,而不是添加到您的源代碼中。
實施 changeGreeting: 方法
在上一章“配置視圖”中,您已配置了“Hello”按鈕,是以在使用者輕按該按鈕時,它發送
changeGreeting:
消息給視圖控制器。作為響應,您想要視圖控制器将使用者在文本欄中輸入的文本顯示在标簽中。具體來說,
changeGreeting:
方法應該:
- 從文本欄取回字元串,并将視圖控制器的
屬性設定為此字元串。userName
- 基于
屬性,建立新的字元串,并将其顯示在标簽中。userName
實施 changeGreeting: 方法
- 如有需要,在項目導航器中選擇
HelloWorldViewController.m
。
您可能需要滾動到檔案的末尾才能看到
存根實作,它是 Xcode 為您添加的。changeGreeting:
- 添加以下代碼來完成
方法的存根實作:changeGreeting:
- (IBAction)changeGreeting:(id)sender { self.userName = self.textField.text; NSString *nameString = self.userName; if ([nameString length] == 0) { nameString = @"World"; } NSString *greeting = [[NSString alloc] initWithFormat:@"Hello, %@!", nameString]; self.label.text = greeting; }
changeGreeting:
方法中有幾項有趣的事值得注意:
-
從文本欄取回文本,并将視圖控制器的self.userName = self.textField.text;
userName
屬性設定為該結果。
在本教程中,您不會在其他任何地方用得上那個儲存着使用者姓名的字元串,但重要的是您要記住它的角色:這正是視圖控制器所管理的非常簡單的模型對象。一般情況下,控制器應在它自己的模型對象中維護應用程式資料的相關資訊。換句話說,應用程式資料不應儲存在使用者界面元素(例如 HelloWorld 應用程式的文本欄)中。
-
建立一個新的變量(為NSString *nameString = self.userName;
類型)并将其設為視圖控制器的NSString
屬性。userName
-
是一個字元串常量,用@"World"
的執行個體表示。如果使用者運作應用程式但不輸入任何文本(即NSString
),[nameString length] == 0
将包含字元串“World”。nameString
-
方法是由 Foundation 架構提供給您的。它建立一個新的字元串,按您提供的格式字元串所規定的格式(很像 ANSI C 庫中的initWithFormat:
printf
函數)。
在格式字元串中,
充當字元串對象的占位符。此格式字元串的雙引号中的所有其他字元都将如實顯示在螢幕上。%@
将視圖控制器配置為文本欄的委托
如果生成并運作應用程式,在點按按鈕時應該會看到标簽顯示“Hello, World!”。如果您選擇文本欄并開始在鍵盤上鍵入,您會發現完成文本輸入後,仍然無法讓鍵盤消失。
在 iOS 應用程式中,允許文本輸入的元素成為第一響應器時,鍵盤會自動出現;元素失去第一響應器狀态時,鍵盤會自動消失。(前面提到過第一響應器是第一個接收各種事件通知的對象,例如輕按文本欄來調出鍵盤。)雖然無法從應用程式直接将消息發送給鍵盤,但是可以通過切換文本輸入 UI 元素的第一響應器狀态這種間接方式,使鍵盤出現或消失。
UITextFieldDelegate
協定是由 UIKit 架構定義的,它包括
textFieldShouldReturn:
方法,當使用者輕按“Return”按鈕(不管該按鈕的實際名稱是什麼)時,文本欄調用該方法。因為您已經将視圖控制器設定為文本欄的委托(在“設定文本欄的委托”中),可以實施該方法,通過發送
resignFirstResponder
消息強制文本欄失去第一響應器狀态,以該方法的副作用使鍵盤消失。
注:協定基本上隻是一個方法清單。如果一個類符合(或采用)某個協定,則保證它可以實施該協定所要求的方法。(協定也可以包括一些可選的方法。)委托協定指定了一個對象可能向其委托發送的所有消息。
将 HelloWorldViewController 配置為文本欄的委托
- 如有需要,在項目導航器中選擇
。HelloWorldViewController.m
- 實施
textFieldShouldReturn:
方法。
此方法應該訓示文本欄放棄第一響應器的狀态。實作結果應該是這樣的:
在本應用程式中,沒有必要真正測試- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { if (theTextField == self.textField) { [theTextField resignFirstResponder]; } return YES; }
表達式,因為隻有一個文本欄。但這是一個很好的模式,因為有些場合您的對象可能是不隻一個同類對象的委托,是以可能有需要對它們加以區分。theTextField == self.textField
- 在項目導航器中選擇
。HelloWorldViewController.h
- 在
行的末尾,添加@interface
<UITextFieldDelegate>
。
您的接口聲明應如下圖所示:
此聲明指定@interface HelloWorldViewController :UIViewController <UITextFieldDelegate> …
類采用HelloWorldViewController
協定。UITextFieldDelegate
測試應用程式
生成并運作應用程式。這一次,一切的表現都應該如您所期望的那樣。在 Simulator 中,輸入您的姓名後,點按“Done”按鈕使鍵盤消失,然後點按“Hello”按鈕将“Hello, 您的姓名!”顯示在标簽中。
如果應用程式的表現不是您所期望的,則需要進行故障排除。對于某些要檢查的區域,請參閱“排除故障和檢查代碼”。
小結
既然您已完成了視圖控制器的實施,您的首個 iOS 應用程式也就圓滿完成了。恭喜您!
傳回馬上着手開發 iOS 應用程式以繼續學習有關 iOS 應用程式開發的内容。如果應用程式未能正确工作,請嘗試下一章中描述的解決問題的方法,然後再傳回馬上着手開發 iOS 應用程式。
下一頁 上一頁
轉載于:https://www.cnblogs.com/Tiotoy/archive/2012/12/21/2828129.html