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

1.3 不使用Interface Builder的Hello World程序

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

不可否認(rèn)Interface Builder是一款設(shè)計(jì)得非常完美的開(kāi)發(fā)工具,使用起來(lái)也非常方便。但是我們?nèi)绻敫钊肜斫釻IKit框架及其中的控件類(lèi)的話(huà),最好還是撇開(kāi)Interface Builder,采取直接編寫(xiě)代碼的方式來(lái)進(jìn)行開(kāi)發(fā),我們可以從中了解到那些由Interface Builder完成的,被隱藏起來(lái)的工作,最后真正理解UIKit框架的工作原理,有助于完成更復(fù)雜iPhone應(yīng)用程序的設(shè)計(jì)。

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

1.3.1 編輯HelloWorldAppDelegate.m

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

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

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

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

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

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

UILabel是創(chuàng)建標(biāo)簽的類(lèi)。UILabel創(chuàng)建完成后,使用initWithFrame:方法進(jìn)行初始化。在initWithFrame:方法的參數(shù)中需要指定具體的位置以及大小,這里為了方便,將其指定為與應(yīng)用程序的窗口(Window)相同的位置及大小。Window的frame屬性中保存了窗口的位置及大小,將這個(gè)frame屬性直接傳入到initWithFrame:方法的參數(shù)中是最簡(jiǎn)便的。

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

最后,不要忘記了對(duì)追加完成的UILabel對(duì)象執(zhí)行release,這是實(shí)現(xiàn)參照統(tǒng)計(jì)式內(nèi)存管理的需要。

1.3.2 刪除MainWindow.xib文件

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

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

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

圖1-12 刪除MainWindow.xib文件

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

圖1-14 編輯info.plist文件

1.3.3 編輯main.m文件

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

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

這樣的修改,是將原來(lái)自動(dòng)設(shè)置的應(yīng)用程序委托(本例為HelloWorldAppDelegate,所謂應(yīng)用程序委托,是當(dāng)應(yīng)用程序狀態(tài)變化時(shí)接收通知的對(duì)象,為繼承了UIApplicationDelegate協(xié)議類(lèi)的實(shí)例),在此明確指定它罷了。UIApplicationMain函數(shù)的第4個(gè)參數(shù)正是用于指定應(yīng)用程序委托的參數(shù)。如果此參數(shù)為nil,會(huì)根據(jù)info.plist文件中設(shè)置的nib或者xib文件,自動(dòng)決定應(yīng)用程序委托。因?yàn)榍懊嬉呀?jīng)刪除了xib文件,在此必須指定字符串“HelloWorldAppDelegate”代表的類(lèi)名,來(lái)決定應(yīng)用程序委托。

1.3.4 再次編輯HelloWorldAppDelegate.m文件

編輯完了main.m,還不能夠正常編譯整個(gè)HelloWorld工程,在HelloWorldAppDelegate.m文件中,有編程經(jīng)驗(yàn)的讀者可能注意到,Window實(shí)例變量還沒(méi)有被初始化。因此還必須再編輯一下HelloWorldAppDelegate.m文件完成Window實(shí)例變量的初始化動(dòng)作。

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

// 自己創(chuàng)建Window對(duì)象
CGRect bounds = [[UIScreen mainScreen] bounds];
window = [[UIWindow alloc] initWithFrame:bounds];

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

UIWindow實(shí)例的創(chuàng)建不是一件很難的事情,先調(diào)用alloc方法生成UIWindow的實(shí)例,然后調(diào)用initWithFrame方法對(duì)其進(jìn)行初始化。此處,需要取出UIScreen類(lèi)的bounds屬性作為畫(huà)面的大小,并以參數(shù)的形式傳入。

最后還有一個(gè)工作需要完成,那就是刪除HelloWorldAppDelegate.m文件中的IBOutlet關(guān)鍵字。實(shí)際上如果不刪除,應(yīng)用程序也不會(huì)有任何問(wèn)題,IBOutlet關(guān)鍵字是Interface Builder識(shí)別插座變量的標(biāo)志,留在程序中也沒(méi)有任何意義。

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

圖1-15 HelloWorld結(jié)果畫(huà)面

主站蜘蛛池模板: 伽师县| 大悟县| 江陵县| 方正县| 南宁市| 德令哈市| 和龙市| 芦山县| 托里县| 齐齐哈尔市| 安新县| 霍州市| 清苑县| 巨鹿县| 河东区| 石河子市| 玉门市| 刚察县| 泸西县| 宜州市| 将乐县| 嘉禾县| 东至县| 乾安县| 晋宁县| 阜南县| 鞍山市| 昭苏县| 兴义市| 芜湖市| 台江县| 溧阳市| 杂多县| 永嘉县| 米易县| 滦平县| 古浪县| 商河县| 铜梁县| 沙雅县| 右玉县|