天天看點

首個 iOS 應用程式(四)實施視圖控制器

下一頁 上一頁

實施視圖控制器

實施視圖控制器包括這幾部分:為使用者姓名添加屬性,實施 

changeGreeting:

 方法,確定使用者輕按“Done”時鍵盤消失。

為使用者姓名添加屬性

您需要為儲存使用者姓名的字元串添加屬性聲明,這樣您的代碼就總能引用該字元串。因為此屬性必須是公共的,即對用戶端和子類為可見,是以須将此聲明添加到視圖控制器的頭檔案,即 

HelloWorldViewController.h

。公共屬性表示您打算如何使用這一類的對象。

屬性聲明是一個指令,它告訴編譯器如何為變量(例如用來儲存使用者姓名的變量)生成存取方法。(添加屬性聲明後,您将了解到有關存取方法的資訊。)

到此為止,不需要對串聯圖檔案做出任何進一步的修改。要騰出更多空間以按照以下步驟來添加代碼,請再次點按“Utilities View”按鈕來隐藏實用工具區域(或者選取“View”>“Utilities”>“Hide Utilities”)。

首個 iOS 應用程式(四)實施視圖控制器

為使用者姓名添加屬性聲明

  1. 在項目導航器中,選擇 

    HelloWorldViewController.h

  2. 在 

    @end

     語句前,為字元串編寫一個 

    @property

     語句。

    屬性聲明應該是這樣的:

    @property (copy, nonatomic) NSString *userName;      
    可以拷貝和粘貼以上代碼,也可以在編輯器面闆中鍵入以上代碼。如果您決定鍵入代碼,請注意 Xcode 會根據鍵入内容提供自動補齊的建議。例如,開始鍵入 

    @prop...

    Xcode 猜測您想要鍵入 

    @property

    ,是以會在内聯建議面闆中顯示這樣一個符号(如下圖所示):
    首個 iOS 應用程式(四)實施視圖控制器

    如果建議合适(如上述示例所示),則按下 Return 鍵接受建議。

    随着您繼續鍵入,Xcode 可能提供一個建議清單供您選取。例如随着您鍵入 

    NSStr...

    ,Xcode 可能顯示如下補齊清單:
    首個 iOS 應用程式(四)實施視圖控制器
    Xcode 顯示補齊清單時,按下 Return 鍵以接受高亮顯示的建議。如果高亮顯示的建議不正确(如上圖所示清單),可使用箭頭鍵從清單中選擇合适的項目。

編譯器自動為您聲明的任何屬性合成存取方法。存取方法是一種擷取或設定一個對象的屬性的值的方法(是以,存取方法有時也稱為“getter”和“setter”)。例如,編譯器為剛剛聲明的 

userName

 屬性生成以下的 getter 和 setter 聲明及其實作:

  • - (NSString *)userName;

  • - (void)setUserName:(NSString *)newUserName;

編譯器也自動聲明專有執行個體變量以支援每一個經聲明的屬性。例如,編譯器聲明名為 

_userName

 的執行個體變量以支援 

userName

 屬性。

注:編譯器将生成的存取方法添加到編譯代碼,而不是添加到您的源代碼中。

實施 changeGreeting: 方法

在上一章“配置視圖”中,您已配置了“Hello”按鈕,是以在使用者輕按該按鈕時,它發送 

changeGreeting:

 消息給視圖控制器。作為響應,您想要視圖控制器将使用者在文本欄中輸入的文本顯示在标簽中。具體來說,

changeGreeting:

 方法應該:

  • 從文本欄取回字元串,并将視圖控制器的 

    userName

     屬性設定為此字元串。
  • 基于 

    userName

     屬性,建立新的字元串,并将其顯示在标簽中。
首個 iOS 應用程式(四)實施視圖控制器

實施 changeGreeting: 方法

  1. 如有需要,在項目導航器中選擇 

    HelloWorldViewController.m

    您可能需要滾動到檔案的末尾才能看到 

    changeGreeting:

     存根實作,它是 Xcode 為您添加的。
  2. 添加以下代碼來完成 

    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

    ),

    nameString

     将包含字元串“World”。
  • initWithFormat:

     方法是由 Foundation 架構提供給您的。它建立一個新的字元串,按您提供的格式字元串所規定的格式(很像 ANSI C 庫中的 

    printf

     函數)。

    在格式字元串中,

    %@

     充當字元串對象的占位符。此格式字元串的雙引号中的所有其他字元都将如實顯示在螢幕上。

将視圖控制器配置為文本欄的委托

如果生成并運作應用程式,在點按按鈕時應該會看到标簽顯示“Hello, World!”。如果您選擇文本欄并開始在鍵盤上鍵入,您會發現完成文本輸入後,仍然無法讓鍵盤消失。

在 iOS 應用程式中,允許文本輸入的元素成為第一響應器時,鍵盤會自動出現;元素失去第一響應器狀态時,鍵盤會自動消失。(前面提到過第一響應器是第一個接收各種事件通知的對象,例如輕按文本欄來調出鍵盤。)雖然無法從應用程式直接将消息發送給鍵盤,但是可以通過切換文本輸入 UI 元素的第一響應器狀态這種間接方式,使鍵盤出現或消失。

UITextFieldDelegate

 協定是由 UIKit 架構定義的,它包括 

textFieldShouldReturn:

 方法,當使用者輕按“Return”按鈕(不管該按鈕的實際名稱是什麼)時,文本欄調用該方法。因為您已經将視圖控制器設定為文本欄的委托(在“設定文本欄的委托”中),可以實施該方法,通過發送

resignFirstResponder

 消息強制文本欄失去第一響應器狀态,以該方法的副作用使鍵盤消失。

注:協定基本上隻是一個方法清單。如果一個類符合(或采用)某個協定,則保證它可以實施該協定所要求的方法。(協定也可以包括一些可選的方法。)委托協定指定了一個對象可能向其委托發送的所有消息。

首個 iOS 應用程式(四)實施視圖控制器

将 HelloWorldViewController 配置為文本欄的委托

  1. 如有需要,在項目導航器中選擇 

    HelloWorldViewController.m

  2. 實施 

    textFieldShouldReturn:

     方法。

    此方法應該訓示文本欄放棄第一響應器的狀态。實作結果應該是這樣的:

    - (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
        if (theTextField == self.textField) {
            [theTextField resignFirstResponder];
        }
        return YES;
    }      
    在本應用程式中,沒有必要真正測試 

    theTextField == self.textField

     表達式,因為隻有一個文本欄。但這是一個很好的模式,因為有些場合您的對象可能是不隻一個同類對象的委托,是以可能有需要對它們加以區分。
  3. 在項目導航器中選擇 

    HelloWorldViewController.h

  4. 在 

    @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