本課會(huì)讓你熟悉Xcode,這個(gè)讓你寫程序的工具。你將熟悉項(xiàng)目在Xcode中的結(jié)構(gòu),并且學(xué)會(huì)如何在基礎(chǔ)項(xiàng)目組件間導(dǎo)航并使用它們。在本課中,你將為FoodTracker應(yīng)用開始制作一個(gè)簡(jiǎn)單的用戶界面(UI)并在模擬器中顯示它。
當(dāng)你完成時(shí),你的應(yīng)用看起來會(huì)像下面這樣:

學(xué)習(xí)目標(biāo)
在本課結(jié)束的時(shí)候,你將學(xué)到:
- 在Xcode中創(chuàng)建一個(gè)項(xiàng)目
- 識(shí)別使用Xcode項(xiàng)目模版創(chuàng)建的關(guān)鍵文件的目的
- 打開和切換項(xiàng)目中的文件
- 在iOS模擬器上運(yùn)行應(yīng)用
- 在storyboard中添加、移動(dòng)UI元素,并改變它的大小
- 在storyboard中使用屬性檢查器編輯UI元素的屬性
- 使用大綱(outline)視圖查看和重排UI元素。
- 利用助手編輯器的預(yù)覽模式預(yù)覽storyboard上的UI
- 使用Auto Layout讓UI能夠自動(dòng)適應(yīng)用戶的設(shè)備尺寸
創(chuàng)建一個(gè)新項(xiàng)目
Xcode包含多種為開發(fā)常見類型的iOS應(yīng)用而準(zhǔn)備的內(nèi)建模版,例如games、tab導(dǎo)航的應(yīng)用、表視圖基礎(chǔ)的應(yīng)用。大多數(shù)的模版都預(yù)設(shè)了界面和源代碼文件。本課,你將使用最基礎(chǔ)的模版:Single View Application。
要?jiǎng)?chuàng)建一個(gè)新項(xiàng)目
1. ?從應(yīng)用程序目錄中打開Xcode
如果這是你第一次啟動(dòng)Xcode, 它會(huì)問你是否同意用戶協(xié)議,并下載額外的組件。按照這些屏幕提示操作,直到Xcode設(shè)置完成并準(zhǔn)備啟動(dòng)。一旦Xcode啟動(dòng)完成,歡迎窗口就會(huì)出現(xiàn)。

如果項(xiàng)目窗口代替歡迎窗口出現(xiàn),別擔(dān)心,也許之前在Xcode中創(chuàng)建或者打開了一個(gè)項(xiàng)目。就使用下面步驟中的菜單項(xiàng)來創(chuàng)建項(xiàng)目。
2. 在歡迎窗口,點(diǎn)擊“Create a new Xcode Project” (或者選擇 File > New > Project)。Xcode打開一個(gè)新窗口,顯示一個(gè)讓你選擇模版的對(duì)話框。
3. 在對(duì)話框的頂部選擇iOS。
4. 在Application區(qū)域,選擇Single View Application,然后點(diǎn)擊Next。

5. 在出現(xiàn)的對(duì)話框中,使用下面的值來命名你的應(yīng)用,并為項(xiàng)目選擇額外的選項(xiàng):
- Product Name: FoodTrackerXcode。使用你填寫的產(chǎn)品名命你的項(xiàng)目和應(yīng)用。
- Team:如果沒有自動(dòng)填充,則寫None。
- Organization Name: 你的組織名或者你自己的名字。這一項(xiàng)也可以空著。
- Organization Identifier:如果有,就寫。如果沒有,就寫com.example。
- Bundle Identifier:這個(gè)值根據(jù)產(chǎn)品名和組織標(biāo)識(shí)符自動(dòng)生成。
- Language: Swift
- Devices: Universal。一個(gè)通用的應(yīng)用可以運(yùn)行在iPhone以及iPad上。
- Using Core Data: Unselected.
- Include Unit Tests: Selected.
- Include UI Tests: Unselected.

6. 點(diǎn)擊Next。
7. 在出現(xiàn)的對(duì)話框中,選擇一個(gè)位置來存儲(chǔ)你的項(xiàng)目,然后點(diǎn)擊Create。Xcode在workspace window中打開新項(xiàng)目。

在workspace窗口中,你或許會(huì)看到一個(gè)錯(cuò)誤圖標(biāo),它的信息顯示“Singing for FoodTracker requires a development team.” 這個(gè)信息的意思是你沒有為iOS開發(fā)設(shè)置好Xcode。不過不用擔(dān)心,完成本課不需要這個(gè)。讓應(yīng)用運(yùn)行在模擬器上,你不需要開發(fā)team。
進(jìn)一步探索
在iOS設(shè)備上運(yùn)行應(yīng)用之前,你需要設(shè)置一個(gè)有效的team,這樣該應(yīng)用才可以被簽名。如果你是蘋果開發(fā)者計(jì)劃的成員,無論是個(gè)人還是成員組織中的一員,你都可以在這里選擇team。否則,你的Apple ID會(huì)被當(dāng)作個(gè)人team,使得你能在設(shè)備上運(yùn)行應(yīng)用。不過,在你向App Store提交應(yīng)用之前,你需要加入蘋果開發(fā)者計(jì)劃。更多信息,選擇Help > Xcode Help, 并搜索“Singing workflow”。
熟悉Xcode
Xcode包含了你創(chuàng)建應(yīng)用所需的一切。它組織那些創(chuàng)建應(yīng)用的文件和資源。它為代碼和用戶界面提供編輯器。還有,Xcode讓你構(gòu)建、運(yùn)行、和調(diào)試你的應(yīng)用—提供iOS設(shè)備模擬器和一個(gè)強(qiáng)大的一體化調(diào)試器。
花一點(diǎn)時(shí)間來熟悉Xcode工作空間主要部分。你將在本課程中使用以下窗口中標(biāo)識(shí)的區(qū)域。不要現(xiàn)在就去了解所有的細(xì)節(jié);每個(gè)區(qū)域的更多細(xì)節(jié)會(huì)在你用到的時(shí)候再詳述。

運(yùn)行iOS模擬器
因?yàn)槟愕捻?xiàng)目基于Xcode的模版,所以基本應(yīng)用程序環(huán)境已經(jīng)自動(dòng)設(shè)置好了。即使你不寫任何代碼,也可以在沒有任何額外的設(shè)置的情況下構(gòu)建并運(yùn)行Single View Application模版。
為了構(gòu)建并運(yùn)行應(yīng)用,使用Xcode中的iOS模擬器。模擬器讓你了解應(yīng)用在設(shè)備上運(yùn)行時(shí)的外觀和行為。
模擬器可以模擬很多種不同類型的硬件,所有不同屏幕尺寸和分辨率的iPad和iPhone,所以你可以模擬每個(gè)你想開發(fā)的設(shè)備。本課使用iPhone7選項(xiàng)。
在模擬器上運(yùn)行應(yīng)用
1. 在Xcode工具欄上選擇Scheme會(huì)彈出一個(gè)菜單,選擇iPhone 7。Scheme彈出菜單提供應(yīng)用要運(yùn)行之上的設(shè)備或模擬器的選項(xiàng)。確保你選擇的是iPhone 7 Simulator,而不是iOS device。

2. 點(diǎn)擊Xcode工具條左上角的Run按鈕。

或者,選擇Product > Run (或者,按下Command-R)。
如果你是第一次運(yùn)行應(yīng)用,Xcode會(huì)詢問是否在Mac上啟動(dòng)開發(fā)者模式。開發(fā)者模式允許Xcode訪問某些調(diào)試功能而無需輸入密碼。決定是否開啟開發(fā)者模式并按照提示進(jìn)行操作。

如果不開啟開發(fā)者模式,則稍后可能會(huì)要求你輸入密碼。本系列課程假定開啟了開發(fā)者模式。
3. 隨著構(gòu)建過程的完成,觀察Xcode工具欄。Xcode會(huì)把構(gòu)建進(jìn)程顯示在activity view中,它位于工具欄的中間位置。
Xcode構(gòu)建應(yīng)用結(jié)束后,模擬器將會(huì)自動(dòng)開啟。在第一次開啟的時(shí)候需要一些時(shí)間。
模擬器以及指定的iPhone模式打開,并啟動(dòng)應(yīng)用。初始時(shí),模擬器顯示應(yīng)用的啟動(dòng)界面,隨后它轉(zhuǎn)換到應(yīng)用的主界面。Single View Application模版在未更改的情況下,啟動(dòng)界面和主界面都是相同的。

現(xiàn)在,Single View Application 模版沒有做什么,它只是顯示了一個(gè)白屏。其他模版有更為復(fù)雜的行為。在你擴(kuò)展模版的功能將之運(yùn)用到應(yīng)用上之前,理解它的用途是很重要的。沒有任何修改的在模擬器中運(yùn)行應(yīng)用是開始理解開發(fā)的好方式。
通過選擇Simulator -> Quit Simulator (或者按 Command-Q)退出模擬器。
查看源代碼
Single View Application 模版有一點(diǎn)用來設(shè)置應(yīng)用環(huán)境的源代碼。首先,來看一下AppDelegate.swift文件。
查看AppDelegate.swift源碼文件
1. 在navigator區(qū)域,確保project navigator是打開的。Project navigator顯示項(xiàng)目中的所有文件。如果project navigator沒有打開,點(diǎn)擊導(dǎo)航選擇器條上最左邊的按鈕(或,選擇 View > Navigators > Show Project Navigator)。

2. 如有必要,點(diǎn)擊FoodTracker文件夾旁邊的三角,在project navigator中展開該文件夾。
3. 選擇AppDelegate.swift。Xcode在窗口的主編輯區(qū)打開這個(gè)源碼文件。

或者,雙擊AppDelegate.swift文件,它會(huì)在一個(gè)獨(dú)立窗口中打開。
App Delegate 源文件
AppDelegate.swift源文件有兩個(gè)主要功能:
- 定義AppDelegate類。App delegate 創(chuàng)建一個(gè)窗口,它用來繪制應(yīng)用的內(nèi)容,也用來對(duì)應(yīng)用中的狀態(tài)轉(zhuǎn)換做出響應(yīng)。
- 它創(chuàng)建了應(yīng)用的入口(entry point),同時(shí)創(chuàng)建了一個(gè)將事件發(fā)送給應(yīng)用的運(yùn)行循環(huán)(run loop)。這項(xiàng)工作由UIApplicationMain屬性(@UIApplicationMain)來完成,它位于文件的頂部。
使用UIApplicationMain屬性相當(dāng)于調(diào)用UIApplicationMain函數(shù),并把AppDelegate類的名稱作為代理類的名稱傳遞。作為響應(yīng),系統(tǒng)創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?。?yīng)用程序?qū)ο筘?fù)責(zé)管理應(yīng)用的生命周期。系統(tǒng)也創(chuàng)建了一個(gè)AppDelegate類的實(shí)例,并且把它分配給應(yīng)用程序?qū)ο蟆W詈?,系統(tǒng)啟動(dòng)應(yīng)用。
一旦你創(chuàng)建一個(gè)新的項(xiàng)目,AppDelegate類就會(huì)自動(dòng)創(chuàng)建。除非你要做很不尋常的事,否則你應(yīng)該使用由Xcode提供這個(gè)類,用它初始化你的應(yīng)用、相應(yīng)應(yīng)用級(jí)別的事件。AppDelegate類遵守UIApplicationDelegate協(xié)議。這個(gè)協(xié)議定義了很多方法,用來設(shè)置應(yīng)用、響應(yīng)應(yīng)用的狀態(tài)改變、以及處理其他一些應(yīng)用級(jí)別的事件。
AppDelegate類包含一個(gè)唯一的屬性:window。
var window: UIWindow?
這個(gè)屬性存儲(chǔ)應(yīng)用的window的引用。這個(gè)window相當(dāng)于應(yīng)用的視圖層級(jí)的根視圖。應(yīng)用的內(nèi)容都繪制在此之上。注意,這個(gè)window屬性是一個(gè)optional,意思是有時(shí)候它可能沒有值(是nil)。
AppDelegate類也包含了下面這些委托方法的存根實(shí)現(xiàn)(stub implementation,可以理解為空實(shí)現(xiàn))。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) —> Bool
func applicationWillResignActive(_ application: UIApplication)
func applicationDidEnterBackground(_ application: UIApplication)
func applicationWillEnterForeground(_ application: UIApplication)
func applicationDidBecomeActive(_ application: UIApplication)
func applicationWillTerminate(_ application: UIApplication)
這些方法讓應(yīng)用程序?qū)ο蠛蛻?yīng)用代理之間可以進(jìn)行交流。在應(yīng)用狀態(tài)轉(zhuǎn)換期間,例如程序啟動(dòng)、轉(zhuǎn)換到后臺(tái)、應(yīng)用被終止等,應(yīng)用程序?qū)ο笳{(diào)用相應(yīng)的委托方法,給應(yīng)用程序一個(gè)做出響應(yīng)的機(jī)會(huì)。你無需做任何事來保證這些方法在正確的時(shí)刻被調(diào)用,因?yàn)檫@些工作應(yīng)用程序都幫你做了。
每個(gè)委托方法都有默認(rèn)行為。如果讓這些方法仍然空著,或者從AppDelegate類中刪除它,只要這些方法被調(diào)用的時(shí)候,這些默認(rèn)行為依然會(huì)起作用。或者,你可以添加自己的代碼到存根方法中,代碼所定義的自定義行為會(huì)在這些方法被調(diào)用的時(shí)候執(zhí)行。
模版也提供了每個(gè)存根方法的注釋。這些注釋描述了應(yīng)用程序如何使用這些方法。你可以使用這些存根方法和注釋,作為設(shè)計(jì)許多通用的應(yīng)用級(jí)別行為的藍(lán)圖。
在本課中,將不會(huì)用到自定義委托方法中的代碼,索尼你不需要改變?nèi)魏蜛ppDelegate.swift中的文件。
視圖控制器源文件
Single View Application模版還有另外一個(gè)源代碼文件:ViewController.swift。在project navigator中選擇ViewController.swift來查看它。

該文件定義了一個(gè)名為ViewController的UIViewController的子類?,F(xiàn)在,這個(gè)類只是簡(jiǎn)單的繼承了所有UIViewController定義的行為。要覆蓋或者擴(kuò)展行為,你需要重寫UIViewController定義的方法。
就像你在ViewController.swift文件中看到的那樣,模版重寫了viewDidLoad()和didReceiveMemoryWarning()兩個(gè)方法;然而,模版的存根實(shí)現(xiàn)方法還沒有做任何事,除了調(diào)用這些方法的UIViewController版本。你可以添加自己的代碼來自定義視圖控制器對(duì)這些事件的響應(yīng)。
盡管模版有didReceiveMemoryWarning()方法,但是你在本系列課程中用不到它,所以刪掉它。
就像你在ViewController.swift文件中看到的,這個(gè)模版的實(shí)現(xiàn)文件重寫了viewDidLoad()和didReceiveMemoryWarning()方法;但是,這個(gè)模版的存根實(shí)現(xiàn)方法還沒有做任何事?,F(xiàn)在,ViewController.swift的代碼看起來應(yīng)該是這個(gè)樣子:
class ViewController: UIViewController {
? ? ? ? override func viewDidLoad() {
? ? ? ? ? ? ? ? super.ViewDidLoad()
? ? ? ? ? ? ? ? // Do any additional setup after loading the view, typically from a nib.
? ? ? ? ?}
}
在h的課程中,你將會(huì)在這個(gè)源代碼文件里寫代碼。
(未完待續(xù)......)