官术网_书友最值得收藏!

1.3 不使用Interface Builder的Hello World程序

上一節我們使用Interface Builder工具創建完成了Hello World應用程序,前一節我們已經介紹過了,我們創建這個Hello World應用程序的主要目的是了解UIkit框架中控件類(如UITableView等)的使用方法,其實Interface Builder中制作界面時使用的就是UIkit框架中的控件類,只不過是使用一種所見即所得的方式來完成界面的設計,另外Interface Builder中還有其他外面看不到的處理。

不可否認Interface Builder是一款設計得非常完美的開發工具,使用起來也非常方便。但是我們如果想更深入理解UIKit框架及其中的控件類的話,最好還是撇開Interface Builder,采取直接編寫代碼的方式來進行開發,我們可以從中了解到那些由Interface Builder完成的,被隱藏起來的工作,最后真正理解UIKit框架的工作原理,有助于完成更復雜iPhone應用程序的設計。

而本節將講解如何將上面的Hello World工程改造成不使用Interface Builder的工程,其實就是去掉了工程中的xib文件,而直接編寫控件代碼。今后就可以利用這個工程測試各種UIkit框架中的控件類。

1.3.1 編輯HelloWorldAppDelegate.m

為了實現去掉HelloWorld工程中的MainWindow.xib文件,我們首先要重新編輯HelloWorldAppDelegate.m文件,將MainWindow.xib中完成的工作轉移到HelloWorldApp Delegate.m中完成。

在代碼編輯窗口雙擊HelloWorldAppDelegate.m文件,編輯HelloWorldApp Delegate.m application:didFinishLaunchingWithOptions方法,其他的只有框架的方法可以刪除掉,如果保留也沒有什么問題。方法application:didFinishLaunchingWithOptions中追加的代碼如下。

-(void)applicationDidFinishLaunching:(UIApplication *)application {
  // 取得與應用程序窗口相同大小的矩形
  CGRect rect = [window frame];
  // 創建UILabel的實例,并初始化
  // 生成與應用窗口大小相同的UILabel
  UILabel* label = [[UILabel alloc] initWithFrame:rect];
  // 在UILabel中顯示信息為“Hello,world!”
  label.text = @"Hello,world!";
  // 將創建完成的UILabel追加到Window中
  [window addSubview:label];
  // 最后請不要忘記了執行release
  [label release];
    // Override point for customization after application launch
    [window makeKeyAndVisible];
}

代碼追加在application:didFinishLaunchingWithOptions方法中事先已有調用makeKeyAndVisible方法的代碼前。

上述新追加的代碼大致依次完成如下的工作。

  • UILabel對象的創建以及初始化。
  • 向UILabel對象設置“Hello World!”信息。
  • 將UILabel對象加入到Window(窗口)中。

UILabel是創建標簽的類。UILabel創建完成后,使用initWithFrame:方法進行初始化。在initWithFrame:方法的參數中需要指定具體的位置以及大小,這里為了方便,將其指定為與應用程序的窗口(Window)相同的位置及大小。Window的frame屬性中保存了窗口的位置及大小,將這個frame屬性直接傳入到initWithFrame:方法的參數中是最簡便的。

UILabel的初始化完成后,接著就是將UILabel對象的text屬性設置為“Hello World!”,最后使用addSubview:方法將UILabel對象追加到Window中。我們從第1.1節看到Window對象的類UIWindow是UIView的子類,而UILabel也是UIView的子類。addSubview:方法正是在UIView類中定義的方法,負責將UIView對象追加到其他UIView對象中。

最后,不要忘記了對追加完成的UILabel對象執行release,這是實現參照統計式內存管理的需要。

1.3.2 刪除MainWindow.xib文件

我們只有將MainWindow.xib文件刪除了之后,才可以說告別了Interface Builder。

選擇“Groups & Files”最上層的HelloWorld,Xcode的中央窗口會顯示工程包含的所有文件及框架(見圖1-12)。選中MainWindow.xib文件,單擊鼠標右鍵,選擇“delete”命令后,在對話框中單擊“Also Move to Trash”按鈕(見圖1-13),即可將MainWindow.xib文件物理刪除。

光進行上述的物理刪除動作,還不能說完全刪除了MainWindow.xib文件的殘余,我們還必須編輯info.plist文件。雙擊圖1-12窗口中的HelloWorld-info.plist文件,我們可以發現在info.plist文件的編輯窗口(見圖1-14)的最后有key名為“Main nib file base name”的項目,單擊鼠標右鍵,在彈出的快捷菜單中選擇“cut”命令,即可將此項刪除。這樣與MainWindow.xib文件相關的所有信息都被刪除干凈了。

圖1-12 刪除MainWindow.xib文件

圖1-13 單擊“Also Move to Trash”按鈕

圖1-14 編輯info.plist文件

1.3.3 編輯main.m文件

刪除了MainWindow.xib文件,算是徹底刪除創建窗口的處理了。我們要復活創建窗口的處理,首先要編輯main.m文件。雙擊圖1-12所示窗口中的main.m文件,打開編輯窗口。將其中調用UIApplicationMain函數的行修改成如下代碼所示。

// 原代碼
// int retVal = UIApplicationMain(argc,argv,nil,nil);
// 只修改第4個參數
int retVal = UIApplicationMain(argc,argv,nil,@"HelloWorld AppDelegate");

這樣的修改,是將原來自動設置的應用程序委托(本例為HelloWorldAppDelegate,所謂應用程序委托,是當應用程序狀態變化時接收通知的對象,為繼承了UIApplicationDelegate協議類的實例),在此明確指定它罷了。UIApplicationMain函數的第4個參數正是用于指定應用程序委托的參數。如果此參數為nil,會根據info.plist文件中設置的nib或者xib文件,自動決定應用程序委托。因為前面已經刪除了xib文件,在此必須指定字符串“HelloWorldAppDelegate”代表的類名,來決定應用程序委托。

1.3.4 再次編輯HelloWorldAppDelegate.m文件

編輯完了main.m,還不能夠正常編譯整個HelloWorld工程,在HelloWorldAppDelegate.m文件中,有編程經驗的讀者可能注意到,Window實例變量還沒有被初始化。因此還必須再編輯一下HelloWorldAppDelegate.m文件完成Window實例變量的初始化動作。

需要在application:didFinishLaunchingWithOptions:方法的最上部追加如下初始化Window實例變量的代碼。

// 自己創建Window對象
CGRect bounds = [[UIScreen mainScreen] bounds];
window = [[UIWindow alloc] initWithFrame:bounds];

上述代碼正是將以前由MainWindow.xib自動創建的窗口(UIWindow)實例,在此自己手動創建的代碼。

UIWindow實例的創建不是一件很難的事情,先調用alloc方法生成UIWindow的實例,然后調用initWithFrame方法對其進行初始化。此處,需要取出UIScreen類的bounds屬性作為畫面的大小,并以參數的形式傳入。

最后還有一個工作需要完成,那就是刪除HelloWorldAppDelegate.m文件中的IBOutlet關鍵字。實際上如果不刪除,應用程序也不會有任何問題,IBOutlet關鍵字是Interface Builder識別插座變量的標志,留在程序中也沒有任何意義。

到此為止,我們已清除了所有與Interface Builder相關的內容,下面可以測試一下應用程序的執行結果,單擊Xcode窗口上部的“Build and Debug”按鈕,編譯建立完成后,顯示如圖1-15所示的畫面。如果想讓字符串“Hello World!”居中顯示,可以修改相關屬性,有興趣的讀者可自行完成。

圖1-15 HelloWorld結果畫面

主站蜘蛛池模板: 琼海市| 宝山区| 胶州市| 会泽县| 浠水县| 安丘市| 综艺| 凤翔县| 樟树市| 阿鲁科尔沁旗| 宁城县| 静海县| 金秀| 泸定县| 东阿县| 留坝县| 奉节县| 大连市| 余庆县| 翁牛特旗| 德昌县| 甘孜| 青浦区| 迭部县| 海阳市| 陇川县| 锡林浩特市| 怀化市| 苗栗市| 含山县| 扎囊县| 通辽市| 古交市| 伊川县| 内黄县| 兴宁市| 礼泉县| 瓮安县| 甘肃省| 高安市| 启东市|