在這個練習(xí)中,你將創(chuàng)建race car類,App會提供一輛賽車内贮,點擊Honk(按汽車喇叭),就會展示這賽車的詳細信息汞斧。App的用戶界面請見圖4-1夜郁。
Exercise: Race Car | Page 105
界面上有六個Label和一個Button控件,App可以顯示賽車的屬性粘勒,用戶可以點擊Honk竞端,點擊Honk時,不會響起汽車喇叭聲仲义,而是會在開發(fā)者日志(developer log)中寫下一段信息婶熬。
你已經(jīng)知道了App有哪些功能,那么打開Xcode吧埃撵,點擊頂部菜單欄的File -> New -> Project(見圖4-2)赵颅。
Page 106 | Chapter 4 : Diving Deeper
從模板中選擇Single View Application(見圖4-3)。
點擊Next暂刘,在Product Name一欄輸入RaceCar(見圖4-4)
Exercise: Race Car | Page 107
Organization Name和Organization Identifier已經(jīng)自動填寫好了饺谬,如果沒有填寫好,輸入你的姓名中間不要有空格谣拣。最后募寨,Language選擇Swift,Devices選擇iPhone森缠,點擊Next拔鹰。
接下來從左側(cè)選擇你要存放的文件夾,點擊Create贵涵,保存工程(見圖4-5)列肢。
Page 108 | Chapter 4 : Diving Deeper
出現(xiàn)了工程的詳細信息界面(見圖4-6)。Project Navigator在左邊宾茂,Standard Editor在中間瓷马,Inspector在右邊。
Exercise: Race Car | Page 109
點擊Project Navigator中的Main.storyboard文件跨晴,出現(xiàn)一個空白界面(見圖4-7)欧聘。
我們這次開發(fā)的App僅限于在iPhone上使用,點擊Inspector的上方第一個按鈕端盆,看起來像是一張紙折了一個角怀骤。到中間部分冤馏,不勾選Use Auto Layout選項号涯。這時會出現(xiàn)一個對話框瓶蝴,選擇iPhone映皆。然后不勾選Disable Size Classes。這時凉敲,Storyboard中的界面形狀會改變(見圖4-8)衣盾。我們將會在第七章詳細介紹Auto Layout的知識。
Page 110 | Chapter 4 : Diving Deeper
確保Inspector在屏幕的右方爷抓。如果沒有出現(xiàn)在屏幕右方势决,點擊Inspector View Button(見圖4-9),就是右上角右邊有一條條紋的按鈕蓝撇,這樣就可以顯示Inspector了果复。
Inspector下方有個小的工具欄按鈕,Object Library圖標是從左往右第三個(圓圈中有個小方塊)渤昌。
打開Object Library后虽抄,在搜索輸入Label(見圖4-10),將三個Label控件拖入到界面中独柑,垂直對齊放在界面的右邊(見圖4-11)迈窟。
Exercise: Race Car | Page 111
三個Label對齊后,按住鼠標左鍵然后拖拽忌栅,覆蓋三個Label车酣,這樣三個Label就被選中了(見圖4-12),接著索绪,到頂部菜單欄中選擇Edit -> Copy或者按Command+C(見圖4-13)湖员。
Page 112 | Chapter 4 : Diving Deeper
接著到頂部菜單欄選擇Edit -> Paste或者按Command+V(見圖4-14)。
Exercise: Race Car | Page 113
這樣又添加了三個Label控件瑞驱,把這三個新的Label選中娘摔,然后拖到界面的右邊,讓Label對齊(見圖4-15)唤反。
Page 114 | Chapter 4 : Diving Deeper
有時候復(fù)制粘貼控件比起從Object Library中拖拽控件會更方便晰筛。最后,把Object Library搜索框中的label文字刪掉拴袭,輸入button(見圖4-16)。
從Object Library中拖一個Button控件曙博,放到兩組Label中間(見圖4-17)拥刻。
Exercise: Race Car | Page 115
雙擊界面左上角的Label,替換文字為Brand父泳,雙擊左邊中間的Label般哼,文字更換為Color吴汪,最后雙擊左邊最下方的Label,文字更換為Top Speed(見圖4-18)蒸眠。如有需要漾橙,重新調(diào)整Label的對齊。
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淘捡。
Exercise: Race Car | Page 117
最后,雙擊Button然后輸入Honk池摧,接著拖拽Button右上角的小方塊焦除,把寬度調(diào)整到60pts(見圖4-20)。
Page 118 | Chapter 4 : Diving Deeper
現(xiàn)在作彤,界面已經(jīng)布局完成了膘魄,接下來需要把界面和controller連接起來。在這里竭讳,controller就是ViewController.swift文件创葡。點擊屏幕右上角的Assistant Editor按鈕,打開Assistant Editor界面(見圖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)诞帐。
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)甲捏。
connection選擇Outlet演熟,Name輸入colorLabel,點擊Connect司顿。
Exercise: Race Car | Page 121
之后會自動生成一行代碼芒粹。
然后選擇界面上右側(cè)底部的Label,同時按住Control鍵大溜,拖到下面這行代碼的下方:
class ViewController: UIViewController {
當出現(xiàn)一條藍色橫線時化漆,松開鼠標(見圖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)。
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)
Page 124 | Chapter 4 : Diving Deeper
接著選擇Cocoa Touch Class(見圖4-31)萧锉。
Exercise: Race Car | Page 125
在Class一欄中輸入RaceCar(見圖4-32),Subclass設(shè)置為NSObject述寡,Language選擇Swift柿隙,點擊Next。
Xcode接下來會讓你選擇存儲地點鲫凶,RaceCar工程已經(jīng)自動選擇了禀崖,如果沒有,選擇RaceCar文件夾螟炫,點擊Create(見圖4-33)波附。
Page 126 | Chapter 4 : Diving Deeper
這時在Project Navigator中有了一個新文件RaceCar.swift(見圖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的方法:屏幕右上角中間按鈕,方塊下方有一條橫線的按鈕缤底,點擊打開,再次點擊隱藏番捂。
現(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)亥宿。
Exercise: Race Car | Page 131
App啟動后卸勺,點擊Honk這個按鈕(見圖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