xcode中文教程_第1頁
xcode中文教程_第2頁
xcode中文教程_第3頁
xcode中文教程_第4頁
xcode中文教程_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、介紹本教程向您演示如何創(chuàng)建一個(gè)簡單的iPhone應(yīng)用程序。本文不打算對iPhone目前可用的特性作全面介紹,而是介紹一些技術(shù),讓您對基礎(chǔ)開發(fā)過程有初步了解。如果您剛開始使用Cocoa Touch進(jìn)行iPhone開發(fā),則您需要閱讀本文檔。閱讀之前,您需要大致了解計(jì)算機(jī)編程基礎(chǔ),尤其是要了解Objective-C。如未曾用過該語言,則至少應(yīng)通讀學(xué)習(xí)Objective-C:入門教材。本文檔不是為了創(chuàng)建一個(gè)優(yōu)雅漂亮的應(yīng)用程序,而是為了向您描述:如何使用Xcode創(chuàng)建并管理一個(gè)工程基礎(chǔ)設(shè)計(jì)模式和iPhone開發(fā)的基本技術(shù)Interface Builder使用入門如何讓應(yīng)用程序響應(yīng)來自標(biāo)準(zhǔn)用戶接口控件的用

2、戶輸入另外,我們還在教程中指出其他一些文檔。只有閱讀這些文檔,您才能充分理解iPhone開發(fā)的工具和技術(shù)。重要:為了學(xué)習(xí)本教程,您需要安裝iPhone SDK和開發(fā)者工具,它們位于iPhone開發(fā)中心。文檔描述的工具包含在iPhone SDK v3.0里面請檢查一下Xcode版本,它不能低于3.1.3。文檔的組織方式本文檔分為如下章節(jié):“教程概述和設(shè)計(jì)模式”“創(chuàng)建您的工程”“添加一個(gè)視圖控制器”“查看Nib文件”“配置視圖”“實(shí)現(xiàn)視圖控制器”“排除疑難”“下一步做什么?”下頁教程概述和設(shè)計(jì)模式本章概述您將要創(chuàng)建的應(yīng)用程序以及將會使用的設(shè)計(jì)模式。教程概述在學(xué)習(xí)過程中,您將創(chuàng)建一個(gè)很簡單的應(yīng)用程序

3、。它含有一個(gè)文本字段,一個(gè)標(biāo)簽和一個(gè)按鍵。您可以把名字輸入到文本字段中,再按下按鍵,這時(shí)標(biāo)簽的文本就會變成 “Hello, !”:盡管這是個(gè)很簡單的應(yīng)用程序,但它介紹了 基本的設(shè)計(jì)模式、工具、以及利用Cocoa Touch進(jìn)行iPhone開發(fā)的基礎(chǔ)技術(shù)。 Cocoa Touch 包括UIKit和Foundation這兩個(gè)框架。當(dāng)在iPhne OS上開發(fā)事件驅(qū)動的圖形化應(yīng)用程序時(shí),您需要使用它們提供的工具和基本結(jié)構(gòu)。同時(shí),Cocoa Touch還包含其他幾個(gè)框架,它們提供一些基本的服務(wù),可用于訪問設(shè)備的特色內(nèi)容,例如訪問用戶的聯(lián)系人。如需要進(jìn)一步了解Cocoa Touch及其在哪些方面適應(yīng)于iP

4、hone OS,請閱讀iPhone OS技術(shù)概覽。 另外,我們將在“設(shè)計(jì)模式”一節(jié)中描述您將使用的主要的設(shè)計(jì)模式。雖然本教程不太顧及用戶界面,但應(yīng)用程序的表現(xiàn)形式是其獲得成功的關(guān)鍵。您應(yīng)該閱讀iPhone人機(jī)接口指南并且研究基于本文檔的樣例代碼(HelloWorld),這樣您才能明白如何改善用戶接口,以使其成為一個(gè)成熟的應(yīng)用程序。同時(shí),您也將了解視圖控制器如何工作以及它如何同iPhone應(yīng)用程序的的架構(gòu)相適應(yīng)。設(shè)計(jì)模式請務(wù)必閱讀Cocoa基礎(chǔ)指南的設(shè)計(jì)模式這一章。您將使用主要的模式如下:委托模型 視圖 控制器目標(biāo)-動作下面對這些模式作簡單介紹并且指出應(yīng)用程序在什么地方會使用它們。委托委托模式是

5、一個(gè)對象周期性地向被指定為其委托的另一個(gè)對象發(fā)送消息,向其請求輸入或者通知某件事情正在發(fā)生。該模式可替換類繼承來對可復(fù)用對象的功能進(jìn)行擴(kuò)展。在本文將要創(chuàng)建的應(yīng)用程序中,應(yīng)用程序?qū)ο髸蚱湮邪l(fā)送消息,通知它主要的啟動例程已經(jīng)完成并且定制的配置可開始執(zhí)行。為了建立并管理視圖,委托會創(chuàng)建一個(gè)控制器實(shí)例。另外,當(dāng)用戶點(diǎn)擊Return按鍵后,文本字段也會通知它的委托(即所創(chuàng)建的控制器對象)。委托方法通常會集中在一起形成一份協(xié)議。 一份協(xié)議基本上就是一個(gè)方法的列表。如果一個(gè)類遵循某個(gè)協(xié)議,則它要保證實(shí)現(xiàn)協(xié)議所要求的方法(有些方法可選擇實(shí)現(xiàn)與否)。委托協(xié)議規(guī)定了一個(gè)對象可以發(fā)送給委托的所有消息。如果需要進(jìn)

6、一步了解協(xié)議及其在Objective-C中的作用,請查看Objective-C 編程語言的協(xié)議。模型-視圖-控制器模型-視圖-控制器 (或者“MVC”)模式將應(yīng)用程序中的對象設(shè)定為三種角色。模型對象表示數(shù)據(jù)。例如,在一款游戲中,SpaceShips和Rockets是模型對象,在一個(gè)用于生產(chǎn)的應(yīng)用中,ToDo項(xiàng)和Contacts是模型對象,在一個(gè)繪畫應(yīng)用中,Circles或Squares是模型對象。本文將創(chuàng)建的應(yīng)用程序用到的數(shù)據(jù)非常簡單-僅僅是一個(gè)字符串-并且該字符串只在一個(gè)方法中使用,因此,嚴(yán)格說,我們甚至沒有必要在程序中使用模型對象,但是程序所用到的設(shè)計(jì)原理卻非常重要。在其他的應(yīng)用程序中,模

7、型對象將會更加復(fù)雜并且可以在多個(gè)地方進(jìn)行訪問。視圖對象知道如何顯示數(shù)據(jù)(模型),并且它們有可能會允許用戶對數(shù)據(jù)進(jìn)行編輯。在本文將要創(chuàng)建的應(yīng)用程序中,您需要一個(gè)主視圖來包含其它幾個(gè)視圖 一個(gè)文本字段,它用于捕獲用戶輸入信息;第二個(gè)文本字段,它用于顯示文本,而文本內(nèi)容則是基于用戶的輸入;另外還需要一個(gè)按鍵,用戶利用它來告知我們第二個(gè)文本字段應(yīng)該被更新??刂破鲗ο笪挥谀P秃鸵晥D之間。在本文將要創(chuàng)建的應(yīng)用程序中,控制器對象將會從輸入文本字段中取得數(shù)據(jù),并把數(shù)據(jù)存放在一個(gè)字符串中,然后再把第二個(gè)文本字段的內(nèi)容更新成恰當(dāng)?shù)闹?,更新操作則由按鍵發(fā)送出來的動作觸發(fā)。目標(biāo)-動作目標(biāo)-動作機(jī)制允許一個(gè)控件對象(諸

8、如按鍵或滑動條) 向另外一個(gè)對象發(fā)送一條消息(即動作),以之作為對某個(gè)用戶事件(例如一個(gè)點(diǎn)擊事件或者一個(gè)敲擊事件)的響應(yīng)。接收到消息的對象則可以對消息進(jìn)行解釋,并將其作為一個(gè)特定于應(yīng)用程序的指令進(jìn)行處理。在本文將要創(chuàng)建的應(yīng)用程序中,當(dāng)按鍵被敲擊時(shí),它會通知控制器根據(jù)用戶的輸入更新模型和視圖。下頁上頁創(chuàng)建您的工程在本章,您將使用Xcode創(chuàng)建前面所說的工程,同時(shí)還將查明應(yīng)用程序的啟動過程。Xcode我們主要利用Xcode來創(chuàng)建iPhone應(yīng)用程序,它是蘋果的IDE(集成開發(fā)環(huán)境)。您也可以利用它來創(chuàng)建各種不同類型的工程,包括Cocoa以及命令行工具。請注意:本書,我們約定 表示一個(gè)段落的開始(有

9、時(shí),該段落包含其后的無序列表),而段落內(nèi)容是教程里需要您執(zhí)行的操作。代碼列表不顯示Xcode的模板文件里的注釋。 啟動Xcode(缺省情況下,Xcode位于 /Developer/Applictions里面),然后請選擇File New Project,這樣就可以創(chuàng)建一個(gè)新工程。您應(yīng)該會看到一個(gè)新的窗口,它和下圖相似:請注意:如果您沒有看到 “Use Core Data for storage”這一選項(xiàng),則請您務(wù)必您安裝iPhone OS SDK3.0版本您應(yīng)該安裝Xcode3.1.3或者更高的版本。 請選中 Window-Based Application 并點(diǎn)擊 Choose按鍵。 (請不

10、要勾選“Use Core Data for storage”,本例不使用Core Data機(jī)制。)完成上述步驟后,屏幕會出現(xiàn)一張表格。請?jiān)谏厦孢x擇工程的存儲位置。 請選擇一個(gè)合適的位置(例如您可以放在桌面也可以放在一個(gè)定制的工程目錄),然后為工程添加一個(gè)名稱HelloWorld再點(diǎn)擊保存按鍵。請注意:在后續(xù)章節(jié)中,我們假定您將工程命名為HelloWorld,因此應(yīng)用程序的委托類就叫做HelloWorldAppDelegate。如果使用其他名稱,則應(yīng)用程序委托類的名稱將為YourProjectNameAppDelegate。完成上述步驟后,您將看到如下的新工程窗口:如果以前未曾用過 Xcode,

11、則請花點(diǎn)時(shí)間來研究下該應(yīng)用。請閱讀Xcode工作空間指南,它可以幫助您理解工程窗口的組織方式以及如何執(zhí)行諸如編輯和保存文件這樣的基本任務(wù)?,F(xiàn)在,您可以鏈編并運(yùn)行程序,這樣就能看到模擬器的外觀。 請選擇 Build Build and Go (Run)或者點(diǎn)擊工具欄中的 Build and Go按鍵。iPhone模擬器應(yīng)該會自動啟動。當(dāng)您的應(yīng)用程序啟動后,您只看到一個(gè)白色屏幕。如希望了解白色的屏幕從何而來,則您需先了解應(yīng)用程序如何啟動。 退出模擬器。應(yīng)用程序引導(dǎo)您創(chuàng)建的模板工程已設(shè)置了基本的應(yīng)用程序環(huán)境。它創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?,將?yīng)用程序和窗口服務(wù)器連接起來,建立一個(gè)運(yùn)行循環(huán)以及其他等等。大部分

12、的工作通過UIApplicationMain函數(shù)完成,請看圖 2-1。圖 2-1應(yīng)用程序引導(dǎo)main.m文件中的main函數(shù)會調(diào)用UIApplicationMain函數(shù): int retVal = UIApplicationMain(argc, argv, nil, nil);該函數(shù)將會創(chuàng)建一個(gè)UIApplicaion類的實(shí)例。同時(shí)它會搜索應(yīng)用程序的Info.plist屬性列表文件。 Info.plist文件是一部字典,它包含諸如應(yīng)用程序名稱、圖標(biāo)這樣的信息。它也可以包含應(yīng)用程序?qū)ο髴?yīng)該加載的nib 文件的名稱,該名稱由NSMainNibFile鍵指定。Nib文件含有一份用戶接口元素及其他對象

13、的檔案您將在后續(xù)章節(jié)進(jìn)一步了解Nib文件的知識。本工程的Info.plist文件具有下面的內(nèi)容: NSMainNibFile MainWindow這表明應(yīng)用程序啟動時(shí)將會加載MainWindow nib文件。 如希望查看nib文件,請雙擊工程窗口Resourcegroup中的MainWindow.xib文件。(雖然該文件的擴(kuò)展名為“xib”,但是我們習(xí)慣稱之為“nib 文件”)。Interface Builder將會啟動并打開該文件。Interface Builder文檔包含四個(gè)對象:一個(gè) 文件擁有者代理對象。實(shí)際上,文件擁有者對象是UIApplication實(shí)例我們將在“文件擁有者”一節(jié)討論

14、該對象。一個(gè) 第一響應(yīng)者代理對象。 本教材并未使用第一響應(yīng)者,但是您可以閱讀iiPhone應(yīng)用程序的編程指南中的事件處理以了解更多信息。一個(gè)HelloWorldAppDelegate的實(shí)例,它會被設(shè)置成應(yīng)用程序的委托。我們將在下一節(jié)討論委托。一個(gè)窗口。它被設(shè)置為白色背景、啟動時(shí)可見。應(yīng)用程序啟動時(shí),您看到的窗口就是它。應(yīng)用程序完成啟動后,您可以執(zhí)行附加定制。下圖描述一種通用模式您將在下一章使用它:應(yīng)用程序?qū)ο笤谕瓿蓡雍髸蛭邪l(fā)送applicationDidFinishLaunching:消息。通常情況下,委托不是自己配置用戶接口,而是創(chuàng)建一個(gè)視圖控制器對象(一種特定的控制器,它負(fù)責(zé)管理一個(gè)

15、視圖遵循“模型-視圖-控制器”描述的模型-視圖-控制器設(shè)計(jì)模式)。然后委托向視圖控制器請求視圖(這個(gè)視圖由視圖控制器根據(jù)要求創(chuàng)建),并將其添加成窗口的子視圖。小結(jié)在本章,您創(chuàng)建了一個(gè)新工程并學(xué)習(xí)了應(yīng)用程序的啟動過程。下一章,您將定義并創(chuàng)建一個(gè)視圖控制器實(shí)例。下頁上頁添加一個(gè)視圖控制器在本文檔的示例程序中,您需要使用兩個(gè)類。一個(gè)是Xcode的應(yīng)用程序模板提供的應(yīng)用程序委托,程序在nib文件中創(chuàng)建了一個(gè)該類的實(shí)例。另一個(gè)是需要您實(shí)現(xiàn)視圖控制器類,您將創(chuàng)建該類的一個(gè)實(shí)例。添加一個(gè)視圖控制器類在大部分iPhone應(yīng)用程序中,視圖控制器起著核心作用。正如其名稱所示,它負(fù)責(zé)管理一個(gè)視圖。在iPhone上,

16、它們也幫助進(jìn)行導(dǎo)航和內(nèi)存管理。雖然本節(jié)例子程序不使用后兩種功能,但對此有所了解很重要。UIKit提供一個(gè)特別的類 即UIViewController類它封裝了視圖控制器應(yīng)該具有的大部分缺省行為。您應(yīng)從它派生子類,在子類中定制應(yīng)用程序的行為。 請選中Xcode項(xiàng)目管理器里的工程(即HelloWorld項(xiàng)目,位于Groups and Files列表的頂部)或者選中Classes文件夾 新文件會被加入到當(dāng)前選擇的位置。 請選擇File New File。在New File窗口中,請選擇Cocoa Touch Classes,然后選擇UIViewController subclass。同時(shí),請勾選Op

17、tions區(qū)域中標(biāo)題為With XIB for user interface的選擇框。請注意:如果您沒有看到“With XIB for user interface”選項(xiàng),請確保您安裝iPhone OS SDK 3.0 版本-您應(yīng)該安裝Xcode3.1.3或者更高的版本。選中 “With XIB for user interface”表明Xcode在創(chuàng)建視圖控制器的同時(shí),會為其創(chuàng)建一份nib文件,并將該文件添加到工程。(我們將在下一章詳細(xì)討論Nib文件。) 請點(diǎn)擊Next,在其后出現(xiàn)的屏幕中為文件起個(gè)名字,例如MyViewController。(類名稱習(xí)慣以一個(gè)大寫字母開頭)。請務(wù)必創(chuàng)建.m和

18、.h文件,并將二者都添加到工程,如下所示:圖 3-1MyViewController 請點(diǎn)擊Finish,文件會被添加到工程??匆幌滦陆ǖ脑次募鷷l(fā)現(xiàn)Xcode已經(jīng)為您提供了各種方法的存根實(shí)現(xiàn)。目前我們無需追究這些方法的具體含義。接下來,我們將創(chuàng)建一個(gè)控制器類的實(shí)例。添加一個(gè)視圖控制器屬性您需確保在應(yīng)用程序生存期間,視圖控制器始終存在。將視圖控制器作為應(yīng)用程序委托的一個(gè)實(shí)例變量是解決該問題的一個(gè)明智的方法。(如希望了解其中因由,請參考Cocoa內(nèi)存管理編程指南。)添加到應(yīng)用程序委托的實(shí)例變量是MyViewController類的實(shí)例。如果您聲明了變量但未告知編譯器MyViewControl

19、ler類的相關(guān)信息,編譯器就會報(bào)告錯(cuò)誤。通過導(dǎo)入頭文件可以解決該問題,但在Cocoa中,通常您應(yīng)該使用一個(gè)前向聲明(forward declaration)它向編譯器承諾MyViewController類將在其他地方定義,因此編譯器現(xiàn)在無需耗時(shí)來對其執(zhí)行檢查。(如兩個(gè)類需相互引用,則前向聲明可以避免環(huán)狀包含,即兩個(gè)頭文件互相包含。)然后,請將MyViewController類的頭文件導(dǎo)入到應(yīng)用程序委托的實(shí)現(xiàn)文件。 請?jiān)趹?yīng)用程序委托頭文件(HelloWorldAppDelegate.h)的接口聲明前面-即HelloWorldAppDelegate聲明前面-添加前向聲明:class MyViewC

20、ontroller; 請?jiān)陬^文件大括號之間添加下面的代碼,這是為了向應(yīng)用程序委托添加一個(gè)實(shí)例變量:MyViewController *myViewController; 請?jiān)诖罄ㄌ栔?end之前添加下面的屬性聲明:property (nonatomic, retain) MyViewController *myViewController;Objective-C 編程語言的屬性聲明有關(guān)于屬性的描述,您可以參考。基本上,上述聲明指定:HelloWorldAppDelegate實(shí)例含有一個(gè)屬性,您可以使用getter和setter方法即myViewController和setMyViewCont

21、roller:方法來訪問該屬性,同時(shí),委托實(shí)例還會保持該屬性(我們將在后續(xù)章節(jié)詳細(xì)討論保持)。為確保正確,請確認(rèn)HelloWorldAppDelegate類的接口文件(即HelloWorldAppDelegate.h文件)如下所示(不顯示注釋):#import class MyViewController; interface HelloWorldAppDelegate : NSObject UIWindow *window; MyViewController *myViewController; property (nonatomic, retain) IBOutlet UIWindow *

22、window;property (nonatomic, retain) MyViewController *myViewController; end現(xiàn)在您可以開始創(chuàng)建視圖控制器的實(shí)例。創(chuàng)建視圖控制器實(shí)例您已經(jīng)把視圖控制器屬性添加到應(yīng)用程序的委托,現(xiàn)在需要實(shí)際創(chuàng)建一個(gè)視圖控制器實(shí)例,并將其設(shè)置為屬性的值。 請?jiān)趹?yīng)用程序委托類實(shí)現(xiàn)文件(即HelloWorldAppDelegate.m文件)中的applicationDidFinishLaunching:方法開頭添加如下代碼,這些代碼用于創(chuàng)建一個(gè)MyViewController實(shí)例:MyViewController *aViewController

23、 = MyViewController alloc initWithNibName:MyViewController bundle:NSBundle mainBundle;self setMyViewController:aViewController;aViewController release;雖然只有三行,但其中含意很多。這些代碼作用如下:創(chuàng)建并初始化一個(gè)視圖控制器類的實(shí)例。使用存取方法將新建的視圖控制器是設(shè)置為myViewController實(shí)例變量值。 請記住,您未單獨(dú)聲明setMyViewController:方法,而是隱式將其作為屬性聲明的一部分詳情請參考“添加一個(gè)視圖控制器屬

24、性”。依照內(nèi)存管理規(guī)則釋放視圖控制器。您先使用alloc方法創(chuàng)建一個(gè)視圖控制器,然后用initWithNibName:bundle:方法對其進(jìn)行初始化。init方法先指定控制器應(yīng)加載的nib文件,然后指定在哪個(gè)程序包中可找到該文件。程序包是文件系統(tǒng)某個(gè)位置的抽象,該位置存放了應(yīng)用程序?qū)玫降拇a和資源。相比自行定位文件系統(tǒng)的資源文件,使用程序包有很多優(yōu)勢。它為我們提供了方便而簡單的APIbundle對象僅通過名稱就可以定位某個(gè)資源甚至連名稱的本地化的工作,它也為您考慮了。如果您需要進(jìn)一步研究程序包,請參考資源編程指南。本書約定您應(yīng)該擁有任何通過alloc 方法創(chuàng)建的對象(請參考內(nèi)存管理規(guī)則了

25、解其他約定)。因此,您還需要:放棄對所創(chuàng)建的對象的擁有權(quán)。通常只在初始化函數(shù)中調(diào)用存取方法來設(shè)置實(shí)例變量。上述代碼第二行使用存取方法來設(shè)置實(shí)例變量,第三行調(diào)用release方法以放棄對所創(chuàng)建對象的擁有權(quán)。您也可以使用其他方式來完成這些功能。例如,可以把這三行代碼替換成下面兩行:MyViewController *aViewController = MyViewController alloc initWithNibName:MyViewController bundle:NSBundle mainBundle autorelease;self setMyViewController:aView

26、Controller;該版本使用autorelease來放棄對新建視圖控制器的所有權(quán)。不過此種方式中,放棄所有權(quán)的動作將在未來的某一時(shí)刻執(zhí)行。如果不理解此代碼的含義,則請閱讀Cocoa內(nèi)存管理變成指南中Autorelease Pools 一章。通常情況下,請盡可能地避免使用autorelease方法,因?yàn)橄鄬τ趓elease方法來說,它是一種資源密集型操作。您也可以將最后一行替換如下:self.myViewController = aViewController;此處點(diǎn)號就是調(diào)用存取方法(即setMyViewController:),這與前述實(shí)現(xiàn)調(diào)用的方法并無不同。點(diǎn)號確實(shí)提供一種更為緊湊的語

27、法特別是在使用嵌套表達(dá)式的時(shí)候。將幾個(gè)屬性合在一起使用時(shí),點(diǎn)號語法能帶來一些附加好處,但到底選擇哪種語法,則很大程度上取決于個(gè)人的偏好-請參考Objective-C編程語言的屬性聲明。如需進(jìn)一步了解點(diǎn)號語法,請參看Objective-C編程語言中的對象,類和消息里面的“點(diǎn)號語法”。建立視圖視圖控制器負(fù)責(zé)管理和配置視圖。您并不直接創(chuàng)建窗口的內(nèi)容視圖,而是從視圖控制器獲取,并將其添加成窗口子視圖。 釋放視圖控制器后,請?zhí)砑尤缦碌拇a:UIView *controllersView = myViewController view;window addSubview:controllersView;您

28、也可以使用一行代碼來完成上面代碼的功能:window addSubview:myViewController view;但是將代碼分為兩行有助于強(qiáng)調(diào)內(nèi)存管理的一個(gè)規(guī)則,它和我們之前看到的相反。由于您并未使用Cocoa內(nèi)存管理編程指南中的內(nèi)存管理規(guī)則里所列出的方法來創(chuàng)建控制器視圖,所以您并不擁有該視圖。因此,把返回的對象傳給窗口后,您無需再對其作后續(xù)處理(即不用釋放這個(gè)對象)。最后一行來自于IDE 提供的模板:window makeKeyAndVisible;這行代碼會讓窗口現(xiàn)已含有您的視圖顯示在屏幕上。之所以在窗口顯示之前把視圖添加進(jìn)去,是為了防止用戶在實(shí)際內(nèi)容顯示前看到短暫的白屏。內(nèi)務(wù)處理您

29、還剩幾個(gè)任務(wù):導(dǎo)入視圖控制器頭文件,合成存取方法,在dealloc方法中釋放視圖控制器(遵循內(nèi)存管理規(guī)則里面的規(guī)定)。 請?jiān)趹?yīng)用程序委托類的實(shí)現(xiàn)文件(即HelloWorldAppDelegate.m)中執(zhí)行下述操作:請?jiān)谖募捻敳繉?dǎo)入MyViewController的頭文件:#import MyViewController.h請?jiān)陬惖?implementation代碼塊中通知編譯器為視圖控制器合成存取方法:synthesize myViewController;請?jiān)赿ealloc方法起始處釋放視圖控制器:myViewController release;實(shí)現(xiàn)源碼列表為確保正確,請確定您的Hel

30、loWorldAppDelegate類的實(shí)現(xiàn)(即HelloWorldAppDelegate.m文件)如下所示:#import MyViewController.h#import HelloWorldAppDelegate.h implementation HelloWorldAppDelegate synthesize window;synthesize myViewController; - (void)applicationDidFinishLaunching:(UIApplication *)application MyViewController *aViewController =

31、MyViewController alloc initWithNibName:MyViewController bundle:NSBundle mainBundle; self setMyViewController:aViewController; aViewController release; UIView *controllersView = myViewController view; window addSubview:controllersView; window makeKeyAndVisible; - (void)dealloc myViewController releas

32、e; window release; super dealloc; end測試應(yīng)用程序現(xiàn)在您可以測試應(yīng)用程序。 編譯并運(yùn)行工程(請選擇Build Build and Run,或者點(diǎn)擊Xcode工具欄的Build and Run按鍵)。應(yīng)用程序應(yīng)能通過編譯,不會報(bào)告錯(cuò)誤。然后您將在模擬器中再一次看到白色的屏幕。小結(jié)在本部分,您添加了一個(gè)視圖控制器類及其伴生nib文件。在應(yīng)用程序委托中,您為控制器實(shí)例聲明了一個(gè)實(shí)例變量和存取方法。同時(shí),您還合成了存取方法并且執(zhí)行了其他幾個(gè)內(nèi)務(wù)處理任務(wù)。最重要的事情是您創(chuàng)建了一個(gè)視圖控制器實(shí)例并將其視圖傳給窗口。下一章,我們將使用Interface Builder來

33、配置nib文件,控制器要使用該文件來加載視圖。下頁上頁查看Nib文件Interface Builder用于創(chuàng)建并配置nib文件。本章描述兩個(gè)重要的概念:插座變量(outlet)以及文件擁有者代理對象。Interface Builder您需使用Interface Builder創(chuàng)建用戶接口。Interface Builder并不生成源碼,而是讓您直接操作對象,并將這些對象保存在一份被稱為nib文件的檔案。術(shù)語:雖然Interface Builder文檔的擴(kuò)展名可能是“.xib” ,但歷史上,其擴(kuò)展名是“.nib”(“NextStep Interface Builder”的首字母縮寫),因此人們就

34、俗稱其為“Nib文件”。程序運(yùn)行時(shí)會加載nib文件,解檔文件中的對象并且將其恢復(fù)到被保存至文件那一瞬間的狀態(tài)-包括對象間的所有關(guān)聯(lián)。如需進(jìn)一步了解Interface Builder,請閱讀Interface Builder用戶指南。查看Nib文件 請雙擊Xcode中視圖控制器的XIB文件(即MyViewController.xib文件),Interface Builder會為您打開該文件。文件包含三個(gè)對象,文件擁有者代理,第一響應(yīng)者代理以及一個(gè)視圖。視圖和XIB文件窗口分開顯示,以便于您對視圖進(jìn)行編輯。文件擁有者Interface Builder文檔中的文件擁有者對象和您添加進(jìn)去的其他對象不同

35、。它不是在加載nib文件的時(shí)候創(chuàng)建,并且它會被設(shè)置為用戶接口的擁有者通常情況下,用戶接口擁有者負(fù)責(zé)加載接口。如果您需更加詳盡的資料,請參看資源編程指南。在您的應(yīng)用程序中,文件的擁有者是MyViewController的實(shí)例。Interface Builder需要知道文件擁有者是什么類型的對象,這樣它才能讓您在文件擁有者和其他對象之間建立恰當(dāng)?shù)年P(guān)聯(lián)。您可以利用Identity Inspector來告訴Interface Builder該對象所屬的類。實(shí)際上,當(dāng)nib文件伴隨著視圖控制器類一同被創(chuàng)建出來時(shí),nib文件中的文件擁有者的類型就已被設(shè)置完成。不過現(xiàn)在,了解一下查看器對您有很大好處。 請?jiān)?/p>

36、Interface Builder文檔的窗口中選擇文件擁有者的圖標(biāo),然后選擇Tools Identity Inspector ,這樣Identity inspect就會顯示出來,如下圖所示:Class Identity中的Class字段的值應(yīng)該是MyViewController。該值只是向Interface Builder承諾文件擁有者是該類的實(shí)例,把該字段設(shè)置成某個(gè)類并不能保證文件擁有者就是所設(shè)的類的實(shí)例。文件擁有者的類型取決于加載nib文件的時(shí)您所設(shè)置的對象。如果它是其他類的實(shí)例,則nib文件中建立的關(guān)聯(lián)就無法正確建立。視圖插座變量您可以使用查看器面板來查看-建立或打斷-一個(gè)對象的關(guān)聯(lián)。

37、請?jiān)贗nterface Builder文檔窗口中按住Control鍵并點(diǎn)擊文件擁有者,這樣就可以在屏幕中顯示一個(gè)半透明的面板,面板里顯示了文件擁有者的關(guān)聯(lián)。目前,文件擁有者只關(guān)聯(lián)視圖控制器的view插座變量。一個(gè)插座變量就是一個(gè)屬性(通常是一個(gè)實(shí)例變量),只不過這個(gè)屬性和nib文件中的某個(gè)項(xiàng)關(guān)聯(lián)在一起。此處的關(guān)聯(lián)表明當(dāng)nib文件被加載并且UIView的實(shí)例解檔之后,視圖控制器的view實(shí)例變量會被設(shè)定指向nib文件中的視圖。加載Nib文件視圖控制器在loadView方法中會自動加載nib文件。加載哪個(gè)文件呢? 請回想一下,您在initWithNibName:bundle:方法的第一個(gè)參數(shù)已指定

38、所要加載的nib文件的名稱了。(請參看“創(chuàng)建一個(gè)視圖控制器實(shí)例”一節(jié))。通常情況下,在視圖控制器整個(gè)生存過程中,loadView方法只調(diào)用一次,目的是為了創(chuàng)建視圖。當(dāng)您調(diào)用視圖控制器的view方法時(shí),如果視圖尚未被創(chuàng)建出來,則控制器會自動調(diào)用自己的loadView方法。(如果視圖控制器由于接收到內(nèi)存警告而清除了自己的視圖,則在必要的時(shí)候,loadView方法會被再次調(diào)用以創(chuàng)建視圖)。如果希望編程創(chuàng)建視圖控制器的視圖,則可以重載loadView方法,并在您自己的實(shí)現(xiàn)中創(chuàng)建視圖。如果您使用initWithNibName:bundle:方法初始化一個(gè)視圖控制器,但是希望在視圖加載之后執(zhí)行附加配置,則

39、應(yīng)該重載控制器的viewDidLoad方法。您可以使用一個(gè)NSBundle實(shí)例自行加載nib文件。如需進(jìn)一步了解nib文件的加載,請參考資源編程指南。測試應(yīng)用程序?yàn)榱舜_信應(yīng)用程序可以正確執(zhí)行,您可以把視圖的背景色設(shè)置成其他顏色(非白色),并在程序運(yùn)行后驗(yàn)證新顏色是否顯示。 請?jiān)贗nterface Builder中選擇視圖,然后選擇Tools Attributes Inspector ,這樣屏幕就會顯示Attributes inspector。 請點(diǎn)擊Background選色板上的方框,讓顏色面板顯示在屏幕上。然后在其中選擇一種不同的顏色。 保存nib文件 編譯并運(yùn)行工程(請點(diǎn)擊工具欄中的Bui

40、ld and Go按鍵)。您的應(yīng)用程序應(yīng)該可以正確編譯,而后應(yīng)該可以再次在模擬器里看到具有恰當(dāng)顏色的屏幕。 請把視圖的背景顏色恢復(fù)成白色并保存nib文件。小結(jié)在本部分,您查看了nib文件,學(xué)習(xí)了插座變量以及如何設(shè)置視圖的背景顏色。您還進(jìn)一步了解如何加載資源以及視圖控制器如何加載nib文件。下一章,您將在視圖中添加控件。下頁上頁配置視圖Interface Builder包含一個(gè)對象庫,您可以將其中的對象添加至nib文件。在這個(gè)對象庫里,一部分是用戶接口元素,例如按鍵和文本字段; 其它則是控制器對象,例如視圖控制器。您的nib文件已含有一個(gè)視圖-現(xiàn)在,您只需要添加按鍵和文本字段。添加用戶接口元素只

41、要將用戶接口元素從Interface Builder庫拖過來,就可以將其添加至視圖。 請?jiān)贗nterface Builder中選擇Tools Library,讓對象庫的窗口顯示在屏幕上您可以從對象庫中拖動視圖項(xiàng),然后將其放在視圖上面,這和您在一個(gè)繪畫應(yīng)用里執(zhí)行的動作相似。 請?jiān)谝晥D上添加一個(gè)文本字段(UITextField),一個(gè)標(biāo)簽 (UILabel)以及一個(gè)按鍵(UIButton)。接下來,您可以使用視圖項(xiàng)適當(dāng)位置的尺寸調(diào)整點(diǎn)來調(diào)整尺寸,可以拖動這些視圖項(xiàng)來進(jìn)行重定位。當(dāng)在視圖內(nèi)移動視圖項(xiàng)時(shí),視圖上會出現(xiàn)藍(lán)色的點(diǎn)劃線,這是對齊引導(dǎo)線。 請根據(jù)下圖排布視圖中的控件:圖 5-1View中包含數(shù)

42、個(gè)用戶接口元素以及一條藍(lán)色的引導(dǎo)線。 接下來,請執(zhí)行下述操作:1. 請?jiān)谖谋咀侄蔚膶傩圆榭雌骼镙斎隮our Name,這將作為文本字段的占位字符串。2. 調(diào)整標(biāo)簽的尺寸,將其擴(kuò)展至與視圖等寬。3. 刪除標(biāo)簽中的文本(“Label”),您可以在標(biāo)簽的屬性查看器里刪除,也可以直接選中文本(雙擊可執(zhí)行選中操作)再按刪除鍵進(jìn)行刪除。4. 給按鍵添加一個(gè)標(biāo)題,請?jiān)诎存I中雙擊鼠標(biāo),然后輸入Hello。5. 請使用查看器將文本字段和標(biāo)簽的文本對齊方式都設(shè)置為居中對齊。最后您的視圖應(yīng)該如下圖所示: 請勾選標(biāo)簽屬性查看器視圖區(qū)域中的Clear Context Before Drawing選項(xiàng)。這是為確保在更新祝

43、賀詞的時(shí)候,標(biāo)簽會先刪除之前的字符串再繪制新字符串。如果不這樣做,字符串就會相互重疊。我們還需要對文本字段執(zhí)行幾處更改-第一處改動顯而易見,其它改動向則不然。首先,您可能希望名稱首字符大寫。第二,您可能希望合理地配置文本字段的關(guān)聯(lián)鍵盤,以便用戶輸入名稱。同時(shí),鍵盤上還需要顯示一個(gè)Done按鍵。我們執(zhí)行這些變動的指導(dǎo)原則是:當(dāng)文本字段被放到視圖時(shí),您知道它所應(yīng)包含的內(nèi)容。因此,您應(yīng)該合理地設(shè)計(jì)文本字段,使得運(yùn)行時(shí)鍵盤可以恰當(dāng)?shù)嘏渲米约?,從而更好地適應(yīng)用戶的任務(wù)。您可以在文本字段的文本輸入特征中完成這些設(shè)置。 請選擇Interface Builder中的文本字段,然后選擇它的屬性查看器。請?jiān)趯傩圆?/p>

44、看器的文本輸入特征區(qū)域中執(zhí)行下述選擇:在Capitalize彈出菜單中, 請選擇Words在Keyboard Type彈出菜單中,請選擇Default在Keyboard Return Key彈出菜單中,請選擇Done 請保存文件。如果在Xcode上編譯并運(yùn)行應(yīng)用程序,當(dāng)程序運(yùn)行起來時(shí),您會看到用戶接口元素根據(jù)您指定的位置擺放。按下視圖中的按鍵,它會變成高亮,在文本字段里點(diǎn)一下,鍵盤會顯示出來。但是目前,我們沒有辦法讓鍵盤消失。您需要在視圖控制器和其它對象之間建立恰當(dāng)?shù)年P(guān)聯(lián),才能解決該問題,也才能添加其他功能。這些內(nèi)容將在下部分介紹。視圖控制器接口聲明為了建立視圖控制器到用戶接口的關(guān)聯(lián),您需要指

45、定一些插座變量(之前說過插座變量就是實(shí)例變量)。同時(shí)您還需要一個(gè)非常簡單的模型對象的聲明,一個(gè)字符串即可。 請?jiān)赬code MyViewController.h文件中的MyViewController類里面添加下面的實(shí)例變量:UITextField *textField;UILabel *label;NSString *string; 然后您需要為這些實(shí)例變量添加屬性聲明, 同時(shí)還需添加一個(gè)changeGreeting:動作方法的聲明:property (nonatomic, retain) IBOutlet UITextField *textField;property (nonatomic

46、, retain) IBOutlet UILabel *label;property (nonatomic, copy) NSString *string;- (IBAction)changeGreeting:(id)sender;IBOutlet是一個(gè)特殊的關(guān)鍵字,它唯一的作用是通知Interface Builder將某個(gè)實(shí)例變量或者屬性當(dāng)成插座變量。實(shí)際上,這個(gè)關(guān)鍵字被定義為空白,因此在編譯的時(shí)候它沒有任何作用。IBAction 是一個(gè)特殊的關(guān)鍵字,它唯一的作用是告訴Interface Builder將某個(gè)方法當(dāng)成目標(biāo)/動作關(guān)聯(lián)中的動作。它被定義為void。視圖控制器還將作為文本字段的委托

47、,因此它必須采用UITextFieldDelegate 協(xié)議。如希望指定一個(gè)類采用某種協(xié)議,請?jiān)诮涌诶^承的類的名稱后面添加協(xié)議名稱,并將其放在尖括號() 中。 請?jiān)赨IViewController后面添加,這是為了讓UIViewController對象采用UITextFieldDelegate協(xié)議。您的接口文件應(yīng)如下所示:#import interface MyViewController : UIViewController UITextField *textField; UILabel *label; NSString *string;property (nonatomic, retain

48、) IBOutlet UITextField *textField;property (nonatomic, retain) IBOutlet UILabel *label;property (nonatomic, copy) NSString *string;- (IBAction)changeGreeting:(id)sender;end 保存MyViewController.h文件,以便讓Interface Builder注意到上述改動。本節(jié)末,您就可以對項(xiàng)目進(jìn)行測試。請?jiān)趯?shí)現(xiàn)文件(即MyViewController.m)中實(shí)現(xiàn)一個(gè)空的changeGreeting:方法。 請?jiān)趇mple

49、mentation MyViewController一行后面添加:- (IBAction)changeGreeting:(id)sender 保存文件。制定關(guān)聯(lián)您已經(jīng)定義了視圖控制器的插座變量和動作,現(xiàn)在開始在nib文件中建立關(guān)聯(lián)。 關(guān)聯(lián)標(biāo)簽和文本字段的插座變更。按下Contrl鍵并點(diǎn)擊文件擁有者,一個(gè)半透明的面板就會顯示出來,面板里面顯示了所有可用的插座變量和動作。請將光標(biāo)從列表右邊的圓圈拖動到所要關(guān)聯(lián)的視圖項(xiàng)上面,這樣就可以建立二者之間的關(guān)聯(lián)。您可以通過面板右下角的尺寸調(diào)整角來調(diào)整面板尺寸,讓它一次所能顯示的插座變量和動作減少一些。如果面板沒有足夠的空間來顯示所有的插座變量和動作,則其上會

50、出現(xiàn)滾動條,您可以使用它在列表視圖里導(dǎo)航。Interface Builder不允許您將插座變量和一個(gè)錯(cuò)誤類型的元素關(guān)聯(lián)在一起。舉個(gè)例子,因?yàn)闃?biāo)簽屬性被聲明為UILabel的實(shí)例,因此它不能和文本字段建立關(guān)聯(lián)。 設(shè)定按鍵的動作方法。請按下Control鍵并點(diǎn)擊視圖中的按鍵,在隨后出現(xiàn)的查看器中,請將光標(biāo)從事件列表Touch Up項(xiàng)的開口圓圈拖動到文件擁有者的圖標(biāo)。待文件擁有者上面出現(xiàn)一個(gè)半透明面板后,請選擇其中的changeGreeting:方法(您可能需要在查看器中滾動才能看到Touch Up事件)。上述關(guān)聯(lián)的意思是:當(dāng)運(yùn)行程序時(shí),如果您的手指從按鍵離開,按鍵就會發(fā)送一條changeGreet

51、ing:消息給文件擁有者對象。(如果需要所有控件事件的定義, 請參看 UIControl。)當(dāng)用戶點(diǎn)擊鍵盤中的Return按鍵,文本字段會向委托發(fā)送一條消息。您可以利用該回調(diào)函數(shù)來消除鍵盤。(請參看“文本字段委托”)。 Se將文本字段的委托設(shè)置成文件擁有者(即視圖控制器)。請按下Control按鍵,并將光標(biāo)從文本字段向文件擁有者拖動,在彈出來的半透明面板中選擇delegate 。測試現(xiàn)在可以對應(yīng)用程序進(jìn)行測試。 鏈編并運(yùn)行項(xiàng)目。在編譯時(shí)會出現(xiàn)幾個(gè)編譯器警告,那是因?yàn)槟鷽]有實(shí)現(xiàn)屬性的存取函數(shù) 下一章我們將會修正這些警告。盡管如此,按鈕還是可以正常工作(被點(diǎn)擊時(shí)高亮)。同時(shí),當(dāng)您觸摸文本字段的時(shí)候

52、,鍵盤會顯示出來,您可以利用它來輸入文本。但是,我們沒有辦法去除鍵盤。要去除鍵盤,您需要實(shí)現(xiàn)相關(guān)的委托方法。這將在下一章介紹。.小結(jié)您在視圖控制器類的接口中添加了實(shí)例變量和屬性聲明,以及一個(gè)動作方法的聲明。您還在類實(shí)現(xiàn)中添加了動作方法的存根實(shí)現(xiàn),并且對nib文件進(jìn)行配置。下頁上頁實(shí)現(xiàn)視圖控制器實(shí)現(xiàn)視圖控制器要做三件事。您需要對實(shí)例變量作一些處理,包括內(nèi)存管理方面的處理;需要實(shí)現(xiàn)changeGreeting:方法;需要確保用戶點(diǎn)擊Done按鍵的時(shí)候,鍵盤會消失。視圖控制器中的屬性首先要讓編譯器合成存取方法。 請?jiān)贛yViewController.m文件的implementation MyView

53、Controller后面添加下列代碼:synthesize textField;synthesize label;synthesize string;添加這些代碼之后,根據(jù)接口文件中給定的屬性規(guī)格,編譯器會為其合成相應(yīng)的存取方法。舉個(gè)例子,接口文件中string屬性的聲明是property (nonatomic, copy) NSString *string;),因此編譯器會為其生成兩個(gè)存取方法,即-(NSString *)string 方法和-(void)setString:(NSString*)newString 方法。setString: 方法會生成一個(gè)傳入字符串的副本,這有助于確保封裝

54、(傳入的字符串有可能會發(fā)生改變,因此您希望讓控制器保留一份自己的副本)。如需進(jìn)一步了解封裝,請參考Objective-C面向?qū)ο缶幊讨改现械摹俺橄蟮臋C(jī)制”。所有屬性的聲明都指定自身屬于視圖控制器,因此您必須在dealloc方法中放棄對這些屬性的所有權(quán)(retain以及copy都隱含控制器對屬性的擁有權(quán),請參考Cocoa內(nèi)存管理編程指南的內(nèi)存管理規(guī)則)。 請更新MyViewController.m文件中的dealloc方法,讓它在調(diào)用超類的實(shí)現(xiàn)之前先釋放實(shí)例變量:- (void)dealloc textField release; label release; string release; super dealloc;changeGreeting: 方法點(diǎn)擊視圖中的按鍵,它會向視圖控制器發(fā)送changeGreeting: 消息。之后,視圖控制器會取得文本字段的內(nèi)容,并據(jù)此更新標(biāo)簽的內(nèi)容。 請按如下方式實(shí)現(xiàn)MyViewController.m文件中changeGreeting: 方法:- (IBAction)changeGreeting:(id)sender self.string = textField.text; NSStri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論