iPhone應用程序 Say Hello實例操作 (中篇)
iPhone應用程序 Say Hello實例操作 (中篇)是本節姐的內容,繼續 iPhone應用程序 Say Hello實例操作 (上篇)開始介紹,先來看內容。項目開始了。
添加視圖控制器(UIViewController)
添加視圖控制器文件在iPhone應用程序中,視圖控制器(UIViewController)起著核心作用。顧名思義,視圖控制器負責管理控制視圖。在iPhone上,它們也幫助進行導航和內存管理。
選中Xcode項目管理器里的項目(即SayHello項目,位于Groups and Files列表的頂部)或者選中SayHello文件夾——新文件在添加時會被加入到當前選擇的位置。 選中后,在Xcode菜單中選擇 File > New > New File,也可以在選中的文件夾上面點右鍵,選擇 New File。
在New File窗口中,請選擇Cocoa Touch,然后選擇UIViewController subclass。
點擊 Next 按鈕,在Options窗口,請勾選 “With XIB for user interface”復選框。選中 “With XIB for user interface”后,Xcode在創建視圖控制器的同時,會為其創建一份nib文件,并將該文件添加到項目中。
點擊Next按鈕,在其后出現的保存文件窗口中,為文件起個名字,例如RootTimelineViewController,并選擇文件存儲的位置,如下所示:
點擊 Save,文件會被添加到項目中。接下來,我們將創建控制器類的實例。
創建視圖控制器實例現在,我們有了視圖控制器的類和nib文件,但要在應用程序代理中使用它,還必須創建類的實例,并且將實例存儲在變量中,以便操作它。
在應用程序委托類的頭文件(即SayHelloAppDelegate.h)中執行下述操作:
在一個類中訪問另一個類,首先需要引用被訪問類的頭文件。所以我們先在應用程序委托頭文件(SayHelloAppDelegate.h)的接口聲明前面-即SayHelloAppDelegate聲明前面引用視圖控制器(RootViewController)的頭文件:
- #import "RootViewController.h"
然后在頭文件大括號之間添加下面的代碼,這是為了向應用程序委托添加一個實例變量:
- RootViewController *viewController;
在大括號之后 @end之前添加下面的屬性聲明:
- @property (nonatomic, retain) RootViewController *viewController;
在頭文件中添加完相應變量和屬性申明后,需要在對應的實現文件中,合成屬性的存取方法,在dealloc方法中釋放視圖控制器的實例。
在應用程序委托類的實現文件(即SayHelloAppDelegate.m)中執行下述操作:
在類的 @implementation代碼塊中通知編譯器為視圖控制器合成存取方法:
- @synthesize viewController;
在dealloc方法起始處釋放視圖控制器:
- [viewController release];
我們已經把視圖控制器屬性添加到應用程序的委托,現在需要實際創建一個視圖控制器實例,并將其設置為屬性的值。
在應用程序委托類實現文件(即SayHelloWorldAppDelegate.m文件)中的applicationDidFinishLaunching: 方法開頭添加如下代碼,這些代碼用于創建一個RootViewController實例:
- RootViewController *controller = [[RootViewController alloc]initWithNibName:@"RootViewController" bundle:nil];
- self.viewController = controller;
- [controller release];
這段代碼的作用如下:
創建RootViewController這個視圖控制器的實例。使用alloc方法創建一個視圖控制器,然后用initWithNibName:bundle:方法對其進行初始化。init方法先指定控制器應加載的nib文件,然后指定在哪個程序包中可找到該文件。程序包是文件系統某個位置的抽象,該位置存放了應用程序將會用到的代碼和資源。
使用屬性的存取方法,將創建好的視圖控制器實例設置為viewController屬性變量的值
根據內存管理規則釋放視圖控制器
視圖控制器用來配置和管理在應用程序中看到的視圖,每一個視圖也對應有一個視圖控制器來管理。窗體(window)有一個根視圖控制器——這個視圖控制器負責配置當窗體顯示時最先顯示的視圖。要讓你的視圖控制器的內容顯示在窗體中,需要去設置窗體的根視圖控制器為你的視圖控制器。
所以我們的項目中,在上面創建視圖控制器實例代碼后面再添加一行代碼,來設置窗體的根視圖控制器為我們新添加的視圖控制器:
- self.window.rootViewController = controller;
最后一行來自于Xcode提供的模板自動生成的代碼:
- [self.window makeKeyAndVisible];
這行代碼會讓包含了視圖控制器視圖的Window窗口顯示在屏幕上。
本章完整代碼,SayHelloAppDelegate.h文件:
- #import <UIKit/UIKit.h>
- #import "RootViewController.h"
- @interface SayHelloAppDelegate : NSObject <UIApplicationDelegate> {
- RootViewController *viewController;
- }
- @property (nonatomic, retain) IBOutlet UIWindow *window;
- @property (nonatomic, retain) RootViewController *viewController;
- @end
- SayHelloAppDelegate.m文件:
- #import "SayHelloAppDelegate.h"
- @implementation SayHelloAppDelegate
- @synthesize window=_window;
- @synthesize viewController;
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- RootViewController *controller = [[RootViewController alloc]initWithNibName:@"RootViewController" bundle:nil];
- self.viewController = controller;
- [controller release];
- self.window.rootViewController = controller;
- [self.window makeKeyAndVisible];
- return YES;
- }
- - (void)dealloc
- {
- [_window release];
- [viewController release];
- [super dealloc];
- }
- @end
測試運行在Xcode的菜單中選擇 Product > Run 或者點擊左上角工具欄上的 Run 按鈕,iPhone模擬器應該會自動啟動。當應用程序啟動后,還是看到一個白色屏幕,不過第一次看到的白色屏幕,是應用程序代理中的Window,而這次看到的白色屏幕,是視圖控制器RootViewController中的視圖。
下一步,我們將開始對界面進行編輯。
編輯Nib文件
在iPhone開發中,一般都會用NIB文件來來負責界面顯示,也就是MVC模型里面的視圖對象,而NIB文件只包含用戶界面元素,不包含任何源碼,那么怎么讓視圖對象和視圖控制器關聯起來呢?這就需要用到兩個非常重要的概念:插座變量(outlet)和文件擁有者代理對象(File's Owner)。
視圖控制器的視圖和Nib文件視圖控制器主要的職責就是配置和管理應用程序中所有的視圖,一般來說,視圖控制器的視圖是放在一個Nib文件中,當然也可以不需要Nib文件,通過程序創建視圖,典型的如UITableViewController這樣的視圖控制器,就可以不需要Nib文件。在創建視圖控制器實例時,其中一個主要的構造函數 initWithNibName:bundle: 的第一個參數就是視圖控制器對應的Nib文件的名字。視圖控制器在其 loadView 方法中加載它的Nib文件。如果是使用 initWithNibName:bundle: 構造函數生成的實例,并且你想在視圖加載完成后進行額外的設置,只要重寫視圖控制器的 viewDidLoad 方法就好了。
在Xcode中點擊打開視圖控制器的Nib文件(即RootViewController.xib文件),在Xcode中即可直接查看和編輯。文件包含三個對象,文件擁有者代理(File's Owner),第一響應者代理(First Responder)以及一個視圖(View)。視圖(View)是視圖控制器的主視圖,在主視圖中還可以添加若干子視圖。文件擁有者代理(File's Owner)代表Nib文件對應的視圖控制器類。理解文件所有者代理的角色,以及如何建立文件所有者和Nib文件中界面元素之間的連接,是非常重要的。
小貼士: 在Xcode中編輯Nib文件時,可以通過點擊右上角工具欄按鈕顯示隱藏相應面板,方便對界面編輯和屬性設置。
文件擁有者(File's Owner)在一個Nib文件中,文件擁有者對象是其中最重要的對象之一,因為正是通過它,來建立起應用程序代碼和Nib界面文件中對象之間的連接,具體來說,它就是對應Nib文件的視圖控制器對象。以本項目為例,RootViewController.xib這個Nib文件的文件擁有者對象就是RootViewController類的實例。
一般來說,在使用模板同時創建UIViewController文件和對應的Nib文件時,它默認會設置Nib文件對應的文件擁有者為創建的UIViewController類。如果要修改或者設置Nib文件對應的文件擁有者,可以使用 Identity Inspector 面板進行設置。
如上圖所示, 本項目的RootViewController.xib文件對應的文件所有者,在Identity Inspector 面板中,Custom Class部分的Class項,可以看到對應的值是RootViewController,這表示文件擁有者就是RootViewController類的實例,就可以在Xcode中訪問文件擁有者類里面標志為IBOutlet的屬性和IBAction的方法,和Nib文件中的界面元素建立關聯。
視圖插座變量
在Xcode中,使用 Inspector 面板,或者在連接面板,可以查看、創建、刪除對象之間的連接。要查看視圖控制器的連接,可以通過以下步驟:
在Xcode的界面中,從左側的文件組選中要查看的視圖控制器的Xib文件
在視圖編輯界面,點擊選中 File's Owner
在 Inspector 面板,選中 Connection inspector,這里會顯示文件所有者所有的插座連接
在視圖編輯界面,按住Control鍵點擊 File's Owner 或者在 File's Owner上點擊右鍵,彈出一個黑色半透明的面板顯示文件所有者的所有連接
在上面第三步,右側面板顯示的連接面板和右鍵點擊File's Owner彈出的半透明連接面板,顯示的信息和作用都是一樣的,可以根據個人習慣靈活使用。到目前為止唯一的連接是視圖控制器的 view 插座變量。一個插座變量就對應視圖控制器類的一個屬性(有時候也可以是一個實例變量),只不過這個屬性和nib文件中的某個界面元素連接在一起。此處的view的連接,表明當nib文件 RootViewController.xib 被加載,并且UIView的實例解檔之后,視圖控制器的view實例變量會被設置為指向nib文件中的視圖。
中間測試
在項目開發中,尤其在對開發工具和語言不熟悉的時候,需要經常性的對新增的功能進行測試,以確保當前功能運行是正常的。比如我們新增了RootViewController這個自定義視圖控制器,需要去測試一下它是不是已經成功添加。要測試視圖控制器工作正常,簡單的辦法修改視圖控制器的視圖的背景色,例如修改為粉紅色背景,然后重新運行,看看是不是界面變成了紅色背景。
要設置視圖控制器的視圖的背景色,步驟如下:
在Xcode的界面中,從左側的文件組選中視圖控制器的Xib文件(RootViewController.xib)
在右側的功能區域,選擇屬性面板(Attributes inspector)
在編輯區域,選擇視圖
在視圖的屬性面板,點擊背景色(Background)對應的顏色下拉框,會彈出顏色選擇面板
在顏色選擇面板,選擇一個合適的顏色,例如粉紅色
保存nib文件
點擊左上角工具欄的Run按鈕,編譯運行項目
正常情況下,編譯應該不會出現任何錯誤,運行后會彈出模擬器,結果如下圖所示:
確認沒有問題后,再將應用的背景色還原。還原的話,將視圖的背景色設置為白色就好了。
配置視圖
Xcode提供了一套對象庫,可以直接添加到Nib文件中。其中一部分示界面元素,例如按鈕和文本輸入框;其他一部分是控制器對象,例如視圖控制器。我們當前項目的nib文件已經包含了視圖,現在只要添加按鈕和文本輸入框就好了。從對象庫中將用戶界面元素拖動到視圖中,基本步驟如下:
在Xcode的界面中,從左側的文件組選中視圖控制器的Xib文件(RootViewController.xib)
在右側的功能區域,顯示對象庫(object library)
添加一個按鈕(UIButton),一個文本輸入框(UITextField),兩個文本標簽(UILabel)到視圖中。可以從對象庫里面拖動并將它們放到視圖
參考前面的原型設計,對界面元素的尺寸和布局進行調整
將右側功能區域切換到屬性面板(Attributes inspector)
選中文本輸入框(Text Field),設置Placehold屬性為“請輸入姓名”
選中左上側的文本標簽(UILabel),設置Text屬性為“姓名”
選中下面的文本標簽(UILabel),設置Text屬性為空,Alignment屬性設置為居中對齊
選中按鈕(UIButton),設置Title屬性為“招呼”
設置好的界面如下所示:
如果我們想讓用戶在輸入時有一些更好的體驗,比如用戶輸入英文名時,默認會首字母大寫;比如鍵盤會顯示完成(Done)按鍵,點擊后完成輸入隱藏鍵盤。要支持這樣的輸入細節,通過設置文本框屬性就可以完成:
在Capitalization下拉列表,選擇Words,以支持首字母大寫
在Return Key下拉列表,選擇Done,以支持鍵盤上顯示完成(Done)按鍵
保存文件后,編譯運行程序,可以看到運行的界面效果和我們在Xcode中擺放的效果是一樣的。點擊按鈕,按鈕會高亮,在文本輸入框中點擊,會彈出輸入鍵盤,鍵盤里可以看到完成(Done)按鈕。但是還不能根據輸入的內容去顯示文字,還不能隱藏鍵盤,因為目前我們還僅僅完成了視圖部分的工作,還需要讓視圖中的對象和視圖控制器的對象之間建立連接,并添加相應的邏輯,才能實現。
小結:關于iPhone應用程序 Say Hello實例操作 (中篇)的內容介紹完了,希望本文對你有所幫助。請繼續閱讀 iPhone應用程序 Say Hello實例操作 (下篇)