編寫一個跑車App吧~第四章練習(xí)Race Car

在這個練習(xí)中,你將創(chuàng)建race car類,App會提供一輛賽車内贮,點擊Honk(按汽車喇叭),就會展示這賽車的詳細信息汞斧。App的用戶界面請見圖4-1夜郁。

圖4-1

Exercise: Race Car | Page 105

界面上有六個Label和一個Button控件,App可以顯示賽車的屬性粘勒,用戶可以點擊Honk竞端,點擊Honk時,不會響起汽車喇叭聲仲义,而是會在開發(fā)者日志(developer log)中寫下一段信息婶熬。

你已經(jīng)知道了App有哪些功能,那么打開Xcode吧埃撵,點擊頂部菜單欄的File -> New -> Project(見圖4-2)赵颅。

圖4-2 新工程New project

Page 106 | Chapter 4 : Diving Deeper

從模板中選擇Single View Application(見圖4-3)。

圖4-3

點擊Next暂刘,在Product Name一欄輸入RaceCar(見圖4-4)

圖4-4

Exercise: Race Car | Page 107

Organization Name和Organization Identifier已經(jīng)自動填寫好了饺谬,如果沒有填寫好,輸入你的姓名中間不要有空格谣拣。最后募寨,Language選擇Swift,Devices選擇iPhone森缠,點擊Next拔鹰。

接下來從左側(cè)選擇你要存放的文件夾,點擊Create贵涵,保存工程(見圖4-5)列肢。

圖4-5

Page 108 | Chapter 4 : Diving Deeper

出現(xiàn)了工程的詳細信息界面(見圖4-6)。Project Navigator在左邊宾茂,Standard Editor在中間瓷马,Inspector在右邊。

圖4-6

Exercise: Race Car | Page 109

點擊Project Navigator中的Main.storyboard文件跨晴,出現(xiàn)一個空白界面(見圖4-7)欧聘。

圖4-7

我們這次開發(fā)的App僅限于在iPhone上使用,點擊Inspector的上方第一個按鈕端盆,看起來像是一張紙折了一個角怀骤。到中間部分冤馏,不勾選Use Auto Layout選項号涯。這時會出現(xiàn)一個對話框瓶蝴,選擇iPhone映皆。然后不勾選Disable Size Classes。這時凉敲,Storyboard中的界面形狀會改變(見圖4-8)衣盾。我們將會在第七章詳細介紹Auto Layout的知識。

圖4-8

Page 110 | Chapter 4 : Diving Deeper

確保Inspector在屏幕的右方爷抓。如果沒有出現(xiàn)在屏幕右方势决,點擊Inspector View Button(見圖4-9),就是右上角右邊有一條條紋的按鈕蓝撇,這樣就可以顯示Inspector了果复。

圖4-9

Inspector下方有個小的工具欄按鈕,Object Library圖標是從左往右第三個(圓圈中有個小方塊)渤昌。

打開Object Library后虽抄,在搜索輸入Label(見圖4-10),將三個Label控件拖入到界面中独柑,垂直對齊放在界面的右邊(見圖4-11)迈窟。

圖4-10
圖4-11

Exercise: Race Car | Page 111

三個Label對齊后,按住鼠標左鍵然后拖拽忌栅,覆蓋三個Label车酣,這樣三個Label就被選中了(見圖4-12),接著索绪,到頂部菜單欄中選擇Edit -> Copy或者按Command+C(見圖4-13)湖员。

圖4-12
圖4-13

Page 112 | Chapter 4 : Diving Deeper

接著到頂部菜單欄選擇Edit -> Paste或者按Command+V(見圖4-14)。

圖4-14

Exercise: Race Car | Page 113

這樣又添加了三個Label控件瑞驱,把這三個新的Label選中娘摔,然后拖到界面的右邊,讓Label對齊(見圖4-15)唤反。

圖4-15

Page 114 | Chapter 4 : Diving Deeper

有時候復(fù)制粘貼控件比起從Object Library中拖拽控件會更方便晰筛。最后,把Object Library搜索框中的label文字刪掉拴袭,輸入button(見圖4-16)。

圖4-16

從Object Library中拖一個Button控件曙博,放到兩組Label中間(見圖4-17)拥刻。

圖4-17

Exercise: Race Car | Page 115

雙擊界面左上角的Label,替換文字為Brand父泳,雙擊左邊中間的Label般哼,文字更換為Color吴汪,最后雙擊左邊最下方的Label,文字更換為Top Speed(見圖4-18)蒸眠。如有需要漾橙,重新調(diào)整Label的對齊。

圖4-18

Page 116 | Chapter 4 : Diving Deeper

右邊Label中展示左邊Label的具體值楞卡。見表格4-1霜运。

表格4-1 Race Car
品牌 Ferrari
顏色 紅色
最高時速 200 mph

雙擊Storyboard中的右側(cè)的Label,然后問text修改為????(見圖4-19)蒋腮。然后將右側(cè)的Label
寬度拖拽至60pts淘捡。

圖4-19

Exercise: Race Car | Page 117

最后,雙擊Button然后輸入Honk池摧,接著拖拽Button右上角的小方塊焦除,把寬度調(diào)整到60pts(見圖4-20)。

圖4-20

Page 118 | Chapter 4 : Diving Deeper

現(xiàn)在作彤,界面已經(jīng)布局完成了膘魄,接下來需要把界面和controller連接起來。在這里竭讳,controller就是ViewController.swift文件创葡。點擊屏幕右上角的Assistant Editor按鈕,打開Assistant Editor界面(見圖4-21)代咸。

圖4-21

為了能夠有更多空間蹈丸,我們把Inspector隱藏起來(點擊屏幕右上角的Inspector View按鈕)。

Assistant Editor會自動打開ViewController.swift文件呐芥,可以同上Assistant Editor頂部文件路徑確認逻杖,就在Automatic這個詞后面。

不是所有的控件都要連接到ViewController.swift文件中思瘟,如果這個控件是靜態(tài)的或者無需變化荸百,就沒有必要連接。左側(cè)的三個Label一直不變滨攻,那么就不需要連接够话。

選擇右側(cè)的Label,按住Control按鈕光绕,拖到下面這行代碼的下方:

class ViewController: UIViewController {

當出現(xiàn)一條藍色橫線時女嘲,松開鼠標(見圖4-22);彈出連接對話框窗口(見圖4-23)诞帐。

圖4-22
圖4-23

Exercise: Race Car | Page 119

connection選擇Outlet欣尼,Name輸入brandLabel,點擊Connect停蕉。

之后會自動生成一行代碼:

@IBOutlet var brandLabel : UILabel!

第一個關(guān)鍵詞@IBOutlet是來表示這是一個oulet連接類型愕鼓,var表示這是一個變量钙态,brandLabel就是這個變量的名字,冒號后面跟著變量的類型UILabel菇晃。brandLabel變量就代表了右側(cè)最上面的Label册倒。

Page 120 | Chapter 4 : Diving Deeper

然后選擇界面上右側(cè)中間的Label,同時按住Control鍵磺送,拖到下面這行代碼的下方:

class ViewController: UIViewController {

注意不要在brandLabel的代碼上松開鼠標驻子,如果你把鼠標錯誤的放到了其他的Label代碼上方,和出現(xiàn)一個藍色盒子册着。一定要在出現(xiàn)一條藍色橫線時拴孤,松開鼠標(見圖4-24);彈出連接對話框窗口(見圖4-25)甲捏。

圖4-24
圖4-25

connection選擇Outlet演熟,Name輸入colorLabel,點擊Connect司顿。

Exercise: Race Car | Page 121

之后會自動生成一行代碼芒粹。

然后選擇界面上右側(cè)底部的Label,同時按住Control鍵大溜,拖到下面這行代碼的下方:

class ViewController: UIViewController {

當出現(xiàn)一條藍色橫線時化漆,松開鼠標(見圖4-26);彈出連接對話框窗口(見圖4-27)钦奋。

圖4-26
圖4-27

connection選擇Outlet座云,Name輸入topSpeedLabel,注意使用駝峰命名法付材,點擊Connect朦拖。

會自動生成一行代碼。

Page 122 | Chapter 4 : Diving Deeper

最后把Button連接到controller中厌衔。當用戶點擊Button時璧帝,Button會在controller中觸發(fā)一個事件,這種連接模式叫做action富寿。

選中界面中間的Button睬隶,同時按住Control鍵,拖到下面這行代碼的下方:

class ViewController: UIViewController {

當出現(xiàn)一條藍色橫線時页徐,松開鼠標(見圖4-28)苏潜;彈出連接對話框窗口(見圖4-29)。

圖4-28
圖4-29

Exercise: Race Car | Page 123

因為這次連接的控件是Button变勇,所以connection選擇Action窖贤,點擊Connection右側(cè)的下拉菜單,選擇Action,然后Name輸入honkTapped赃梧,點擊Connect。

會自動生成一行代碼豌熄,Action連接創(chuàng)建的是方法授嘀,Outlet連接創(chuàng)建的是變量。每次用戶點擊Button時锣险,honkTapped方法就會被調(diào)用蹄皱。看一下Xcode生成的這段代碼:

@IBAction func honkTapped(sender : AnyObject) {

}

第一個關(guān)鍵詞@IBAction是來表示這是一個action連接類型芯肤,func表示這是一個方法巷折,honkTapped就是這個方法的名字,括號內(nèi)是方法的參數(shù)崖咨,括號里是參數(shù)的名字和類型锻拘,冒號后面就是這個參數(shù)的類型AnyObject。AnyObject起一個placeholder的作用击蹲,可用表示任何類型的對象署拟。sender參數(shù)指向觸發(fā)action的控件,sender參數(shù)根據(jù)控件的不同可以有很多不同的類型歌豺,像是Button推穷,Slider,或者Segmented Control类咧。

現(xiàn)在界面上所有需要連接的控件都已經(jīng)連接到controller中了馒铃,是時候來創(chuàng)建你的race car了。然而痕惋,蘋果并沒有提供一個race car的類区宇,沒關(guān)系,你可以自己創(chuàng)建一個race car類血巍。

選擇File -> New -> File(見圖4-30)

圖4-30

Page 124 | Chapter 4 : Diving Deeper

接著選擇Cocoa Touch Class(見圖4-31)萧锉。

圖4-31

Exercise: Race Car | Page 125

在Class一欄中輸入RaceCar(見圖4-32),Subclass設(shè)置為NSObject述寡,Language選擇Swift柿隙,點擊Next。

圖4-32

Xcode接下來會讓你選擇存儲地點鲫凶,RaceCar工程已經(jīng)自動選擇了禀崖,如果沒有,選擇RaceCar文件夾螟炫,點擊Create(見圖4-33)波附。

圖4-33

Page 126 | Chapter 4 : Diving Deeper

這時在Project Navigator中有了一個新文件RaceCar.swift(見圖4-34)。

圖4-34

Exercise: Race Car | Page 127

你的這個RaceCar類應(yīng)該有三個屬性和一個方法:brand,color掸屡,top speed以及honk方法封寞,當RaceCar honk時,會在調(diào)試窗口打印出一行信息仅财。開發(fā)者一般在調(diào)試窗口調(diào)試變量和事件狈究。用戶是無法看到developer log,這也是一個調(diào)試解決bug的好工具盏求。

給你的RaceCar寫下第一個屬性:

class RaceCar: NSObject {
    var brand: String = "Ferrari"
}

增加屬性看起來像是在創(chuàng)建變量抖锥,不過屬性是可以讓其他對象獲取的。var用了創(chuàng)建屬性碎罚,var后面跟著屬性名稱磅废,接著冒號后面跟著屬性的類型,等號后面是屬性的值荆烈,字符串用雙引號括起來拯勉。

接著增加第二個屬性:

class RaceCar: NSObject{
    var brand: String = "Ferrari"
    var color: String = "Red"
}

color屬性的格式和語法與brand屬性相同。屬性名字是color耙考,默認值是Red谜喊,類型是String,用戶雙引號將字符串的內(nèi)容括起來倦始。

最后斗遏,增加第三個屬性:

class RaceCar: NSObject {
    var brand: String = "Ferrari"
    var color: String = "Red"
    var topSpeed: Int = 200
}

topSpeed的屬性多少有些不同了,類型是Int鞋邑,因為最高時速是一個整型數(shù)字诵次,所以默認值設(shè)置為200,屬性是Int枚碗。

現(xiàn)在RaceCar類的屬性已經(jīng)都寫完了逾一,從RaceCar類中創(chuàng)建的車都會有brand,color和top speed這三個屬性肮雨,默認值是"Ferrari"遵堵,"Red"和200。

RaceCar類還需要有一個honk行為怨规,也就是honk方法陌宿,那么,我們把honk方法添加到RaceCar類中:

Page 128 | Chapter 4 : Diving Deeper

class RaceCar: NSObject {
    var brand: String = "Ferrari"
    var color: String = "Red"
    var topSpeed: Int = 200

    func honk() {
        print("Honk! Honk!")
    }
}

func關(guān)鍵詞用來聲明方法波丰,honk是這個方法的名字壳坪,括號里是空的表示這個方法沒有參數(shù)值。

在方法里面掰烟,用兩個左右大括號包起來爽蝴,只有一行代碼沐批,就是print這行代碼,將"Honk! Honk!"打印到Debugger窗口中蝎亚。

Debug Console或者Debugger(調(diào)試窗口)九孩,在寫代碼時候一般是隱藏的,當程序運行時颖对,會出現(xiàn)(見圖4-35)捻撑。打開Debugger的方法:屏幕右上角中間按鈕,方塊下方有一條橫線的按鈕缤底,點擊打開,再次點擊隱藏番捂。

圖4-35

現(xiàn)在RaceCar類已經(jīng)寫完了个唧,那么,現(xiàn)在用RaceCar這個類來創(chuàng)建一輛跑車吧设预♂慵撸快捷鍵Command+S保存剛剛的操作。

Exercise: Race Car | Page 129

點擊打開Project Navigator里的ViewController.swift文件鳖枕,點擊右上角Standard Editor按鈕來隱藏收起Assistant Editor魄梯。

把鼠標光標放到honkTapped方法中,然后添加下面的代碼:

@IBAction func honkTapped(sender: AnyObject) {
//Create Car
//Display Car 
//Honk Car
}

把鼠標光標放到//Create Car這行代碼后面然后敲擊回車宾符,輸入下列代碼:

var myCar = RaceCar()

var用了創(chuàng)建變量酿秸,myCar是變量名,等號表示把等號右邊的值復(fù)制給等號左邊的變量魏烫。最后辣苏,用RaceCar()創(chuàng)建一個新的RaceCar。

RaceCar()調(diào)用RaceCar類的初始化方法哄褒,把默認值返回給這個新的RaceCar(也就是myCar)稀蟋。這初始化方法是Xcode自動生成的。從一個類中創(chuàng)建對象呐赡,寫下這個類的名字退客,后面跟上一對括號。在這里的這個例子中链嘀,沒有參數(shù)萌狂,所以括號內(nèi)是空的。

現(xiàn)在這個新的RaceCar賦給了myCar變量管闷。把鼠標光標放到//Display Car后面然后敲擊回車粥脚,寫下下方代碼:

brandLabel.text = myCar.brand

這行代碼的作用是把myCar這個變量中的brand賦值給界面上brandLabel這個控件中text屬性。在這里包个,brandLabel上顯示的文字是"Ferrari"刷允,點這個符號可以獲取Label的屬性和方法冤留,例如此處跟上了text這個屬性。

myCar這個變量表示剛剛創(chuàng)建的新的RaceCar树灶,后面的點符號可以獲取RaceCar的屬性和方法纤怒,例如此處獲取了brand這個屬性,這個屬性返回一個string類型的值天通,和brandLabel的text屬性類型對應(yīng)一致泊窘。

在//Display后面敲擊回車,輸入下方代碼:

colorLabel.text = myCar.color
topSpeedLabel.text = "\(myCar.topSpeed)"

你可能會注意到像寒,colorLabel這行代碼和上面的brandLabel代碼非常相似烘豹。這行代碼獲取了RaceCar的color屬性然后賦值給了colorLabel這個控件,默認值是"Red"诺祸。

Page 130 | Chapter 4 : Diving Deeper

topSpeed這行代碼和前面兩行稍微有些不同携悯,topSpeedLabel這個控件應(yīng)該顯示的RaceCar的topSpeed這個屬性,Label.text需要的是string類型的值筷笨,然后RaceCar的topSpeed這個屬性的值是Int類型憔鬼,類型不一致,需要轉(zhuǎn)換胃夏,使用()即可轉(zhuǎn)換轴或。

鼠標光標放到//Honk后面,然后敲擊回車仰禀,輸入下方這行代碼:

myCar.honk()

這行代碼會觸發(fā)RaceCar的honk方法(點符號可以獲取對象的屬性和方法)照雁,然后就會在Debugger中看到一行消息。括號里空的表示沒有參數(shù)悼瘾。

現(xiàn)在可以運行App看看效果了囊榜。點擊左上角的Play按鈕(或者快捷鍵Command+R),Xcode會啟動模擬器(見圖4-36)亥宿。

圖4-36

Exercise: Race Car | Page 131

App啟動后卸勺,點擊Honk這個按鈕(見圖4-37)。

圖4-37

RaceCar的屬性都顯示在對應(yīng)的Label中了烫扼,點擊Honk按鈕后曙求,會調(diào)用honk()方法,然后在Debugger中打印一段信息:“Honk! Honk!”

Page 132 | Chapter 4 : Diving Deeper

如果App沒有按照你想要的結(jié)果運行映企,或者程序有了錯誤或警告悟狱,不要太擔(dān)心,學(xué)習(xí)的最佳方式就是試錯堰氓,熟能生巧挤渐,到我們的網(wǎng)站上下載示例代碼,對比一下代碼双絮,多試幾次浴麻,直到搞定這個程序為止得问。

Exercise: Race Car | Page 133

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市软免,隨后出現(xiàn)的幾起案子宫纬,更是在濱河造成了極大的恐慌,老刑警劉巖膏萧,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漓骚,死亡現(xiàn)場離奇詭異,居然都是意外死亡榛泛,警方通過查閱死者的電腦和手機蝌蹂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曹锨,“玉大人叉信,你說我怎么就攤上這事∷蚁#” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵硅急,是天一觀的道長覆享。 經(jīng)常有香客問我,道長营袜,這世上最難降的妖魔是什么撒顿? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮荚板,結(jié)果婚禮上凤壁,老公的妹妹穿的比我還像新娘。我一直安慰自己跪另,他們只是感情好拧抖,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著免绿,像睡著了一般唧席。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘲驾,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天淌哟,我揣著相機與錄音,去河邊找鬼辽故。 笑死徒仓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的誊垢。 我是一名探鬼主播掉弛,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼症见,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狰晚?” 一聲冷哼從身側(cè)響起筒饰,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壁晒,沒想到半個月后瓷们,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡秒咐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年谬晕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片携取。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡攒钳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雷滋,到底是詐尸還是另有隱情不撑,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布晤斩,位于F島的核電站焕檬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏澳泵。R本人自食惡果不足惜实愚,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兔辅。 院中可真熱鬧腊敲,春花似錦、人聲如沸维苔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蕉鸳。三九已至乎赴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潮尝,已是汗流浹背榕吼。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勉失,地道東北人羹蚣。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像乱凿,于是被迫代替她去往敵國和親顽素。 傳聞我的和親對象是個殘疾皇子咽弦,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容