02 - xcode使用

好萊塢電影里經(jīng)??吹胶诳蛡兪种冈阪I盤(pán)上飛速跳躍,同時(shí)終端上的代碼也隨著飛舞。如果你也想像電影里那樣,那么你來(lái)對(duì)地方了。這篇教程將會(huì)教你在Xcode編程中更像程序員,你可以稱(chēng)之為魔法、瘋狂的技術(shù)、好運(yùn)當(dāng)頭或者黑客。毫無(wú)疑問(wèn),在學(xué)習(xí)完本教程之后,不管你怎么認(rèn)為,都會(huì)感覺(jué)很酷,同時(shí)能更高效地運(yùn)用Xcode,甚至可以通過(guò)這些新發(fā)現(xiàn)使你的代碼免于毀滅。

本章內(nèi)容包括:
開(kāi)始
日常Xcode任務(wù)
快捷鍵
Xcode的行為
小測(cè)驗(yàn)
加速
讓設(shè)計(jì)師高興
提升和超越
代碼片段
何去何從

1.開(kāi)始
要看起來(lái)很酷,所以有一些必不可少的因素.下面列出來(lái)的是其中一部分:
(1)快速執(zhí)行任務(wù)
(2)精準(zhǔn)
(3)簡(jiǎn)潔美觀的代碼

要表現(xiàn)地更酷,你可以試著不用鼠標(biāo)或者觸摸板來(lái)完成教程中的每一個(gè)任務(wù)。學(xué)習(xí)之旅將從學(xué)習(xí)一些實(shí)用的Xcode功能開(kāi)始,然后通過(guò)修復(fù)一些在CardTilt中的一些bug來(lái)訓(xùn)練。最后你將整理一下你的代碼,使整個(gè)界面看起來(lái)更整潔。在學(xué)習(xí)該教程時(shí),要記住:它不是教你做一個(gè)app,而是教你比以前更有效地利用Xcode來(lái)開(kāi)發(fā)app。這篇教程建立在你對(duì)Xcode有一個(gè)基本的了解的基礎(chǔ)上,然后著重于提高你的工作效率。每個(gè)人都有自己的編程習(xí)慣,本教程并非強(qiáng)制你形成某種風(fēng)格。自始至終,本教程中你會(huì)看到某些命令的替代品,隨著本教程的學(xué)習(xí),請(qǐng)集中精力在提煉和形成你自己的編程風(fēng)格,不要讓微小的錯(cuò)誤影響你。
Note: 如果你對(duì)于Xcode不是很熟悉,建議先學(xué)習(xí)下面兩篇教程。

教程1教程2

下載 CardTilt-starter ,然后就可以愉快地寫(xiě)代碼了。

2.日常Xcode任務(wù)
有一些在Xcode中你經(jīng)常使用的技巧,這一部分讓你更近距離的接觸這些技巧,然后講解一些瀟灑應(yīng)對(duì)它們的一些妙招。在這個(gè)過(guò)程中,你會(huì)在這些妙招的基礎(chǔ)上發(fā)現(xiàn)使用它們的新方法。這些技巧將成為你編程工具腰帶上的忍者之星。在Xcode中打開(kāi)之前下載好的工程CardTilt,先不要急著去看代碼,先將你Xcode的窗口和下圖來(lái)一一對(duì)應(yīng)

是不是發(fā)現(xiàn)你的窗口和圖中并不對(duì)應(yīng),先別著急。在下面介紹的快捷鍵部分,你將會(huì)學(xué)到如何輕松地顯示以及隱藏這些對(duì)應(yīng)的窗口。

下面是組成窗口的每一個(gè)獨(dú)立區(qū)域的快速瀏覽:
**The Toolbar(工具欄): **你選擇視圖,運(yùn)行app,在不同布局界面切換的地方
**The Navigation Area(導(dǎo)航區(qū)): **導(dǎo)航你整個(gè)工程,警告,報(bào)錯(cuò)等的地方
**The Editing Area(編輯區(qū)): **所有奇跡誕生的地方,包括它上方的Jump bar
**The Utility Area(工具區(qū)): **包含檢測(cè)器和一些庫(kù)
The Debugging Area(調(diào)試區(qū)): 包括調(diào)試窗口和變量檢測(cè)器

上面列出的所有視圖區(qū)域都是Xcode的必要組成部分,它們也是在你開(kāi)發(fā)過(guò)程中可能需要用到的,開(kāi)發(fā)過(guò)程中通常不需要將他們一次性同時(shí)顯示出來(lái),下面將介紹一些快捷鍵,將會(huì)教你快速顯示/隱藏這些視圖區(qū)域。

3.快捷鍵
在這一部分,你將首先學(xué)到怎么掌握這些快捷鍵,得益于一些模式,最有效的快捷鍵非常容易記。

第一個(gè)需要知道的是Xcode的各區(qū)域與修飾鍵的關(guān)系,下面是一個(gè)快速瀏覽:

用來(lái)導(dǎo)航,控制導(dǎo)航區(qū)域
控制右邊的一些東西,比如Assistant Editor,utility editor
**Control: **編輯區(qū)域上的Jump bar的一些交互

第二個(gè)需要知道的時(shí)數(shù)字鍵和標(biāo)簽欄的關(guān)系,將數(shù)字鍵和上面提到的修飾鍵組合可以在標(biāo)簽頁(yè)之間來(lái)回切換。通常數(shù)字鍵對(duì)應(yīng)標(biāo)簽頁(yè)的索引位置(從1開(kāi)始),0通常用來(lái)顯示/隱藏區(qū)域。它還能再直觀一點(diǎn)嗎?
下面是最常用的組合鍵:
Command 1~ 8: 跳轉(zhuǎn)到導(dǎo)航區(qū)的不同位置
Command 0 :顯示/隱藏導(dǎo)航區(qū)
Command Alt 1~ 6:在不同檢測(cè)器之間跳轉(zhuǎn)
Command Alt 0: 顯示/關(guān)閉工具區(qū).
Control Command Alt 1~4: 在不同庫(kù)之間跳轉(zhuǎn)
Control 1~ 6: 在Jump bar的不同標(biāo)簽頁(yè)的跳轉(zhuǎn)。


最后也是最簡(jiǎn)單的就是回車(chē)鍵,當(dāng)它和Command組合使用時(shí),可以是你在Xcode中不同編輯器來(lái)回切換。
Command + Enter: 顯示標(biāo)準(zhǔn)單窗口編輯器
Command Alt Enter:你可以猜下它的作用,它的功能是打開(kāi)Assistant editor
Command Alt Shift Enter: 打開(kāi)版本控制編輯器

同樣重要的是顯示/隱藏調(diào)試區(qū)的快捷鍵是 Command + Shift + Y ,要記住這個(gè)你可以通過(guò)這句話來(lái)記憶 “Y is my code not working?” (譯者注:Y諧音Why)。如果你忘記了一些快捷鍵,你可以在Xcode的菜單欄Navigate一項(xiàng)中找到大部分快捷鍵。在即將完成這一部分的學(xué)習(xí)之時(shí),你會(huì)驚奇的發(fā)現(xiàn)你僅僅只是用了鍵盤(pán)就讓Xcode發(fā)生這各種變換。


4.Xcode的行為
使用快捷鍵來(lái)管理Xcode的界面卻是挺棒,有沒(méi)有想過(guò)更棒的事情?比如讓 Xcode 自動(dòng)轉(zhuǎn)換到你想看到的界面。接下來(lái)我們將學(xué)到更酷的東西。

幸運(yùn)的是, Xcode 提供的 Behaviors(行為) 可以讓你輕易地實(shí)現(xiàn)上面的事情。它們是一組定義好的有指定事件觸發(fā)的動(dòng)作,比如 build 一個(gè)工程。這里的動(dòng)作的范圍從改變界面到運(yùn)行一個(gè)自定義腳本文件。來(lái)看一個(gè)例子,快速修改下載好的工程的 CTAppDelegate.m 文件,使其運(yùn)行時(shí)會(huì)生成調(diào)試窗口輸出,用下面的方法替代 didFinishLaunchingWithOptions 方法

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    // Override point for customization after application launch.
    NSLog(@"Show me some output!");
    return YES;
    }

運(yùn)行程序,然后仔細(xì)觀察調(diào)試區(qū),你會(huì)發(fā)現(xiàn)調(diào)試區(qū)隨著 app 運(yùn)行而出現(xiàn),如下所示:


來(lái)看看是什么定義了上面的事件,在 Xcode->Behaviors->Edit Behaviors 打開(kāi) Behavior 偏好設(shè)置,在左側(cè)你將看到所有事件集合,在右邊是該事件可以觸發(fā)的一些列動(dòng)作。點(diǎn)擊 Running 欄下的 Generates output,然后發(fā)現(xiàn)它被設(shè)置成用來(lái)顯示調(diào)試區(qū)。


4.1 一些推薦的行為
**Note: **根據(jù)你的開(kāi)發(fā)環(huán)境,我推薦的兩種不同的Generates output事件觸發(fā)動(dòng)作集。如果你有多個(gè)屏幕,試著使用第一種,如果是單顯示器,試著調(diào)到第二種方法。

4.1.1 方法一
如果你在兩個(gè)或者多個(gè)屏幕上開(kāi)發(fā),把調(diào)試區(qū)放到第二屏幕是不是更加方便,你可以向下面這樣設(shè)置


現(xiàn)在,運(yùn)行程序,然后你會(huì)看到一個(gè)分離的窗口出現(xiàn),將它放到你的第二屏幕上,是不是效率高了不少?

4.1.2 方法二
如果是單屏,通過(guò)隱藏工具板以及設(shè)置輸出窗口占據(jù)整個(gè)調(diào)試區(qū)使輸出窗口的有效區(qū)域最大化,設(shè)置如下


然后運(yùn)行程序,然后觀察 Xcode ,看它是不是按照你的命令在執(zhí)行。


當(dāng)程序暫停的時(shí)候,你可能也想改變 Xcode 的行為,到 Running 欄下的 Pauses 事件,然后改變其設(shè)置,向下面這樣:



現(xiàn)在無(wú)論何時(shí)你設(shè)置了斷點(diǎn),你將會(huì)得到一個(gè)新的名為fix的展示變量和輸出窗口的標(biāo)簽頁(yè),然后自動(dòng)導(dǎo)航到第一個(gè)issue。

你將要?jiǎng)?chuàng)建的最后一個(gè)行為是我個(gè)人最喜歡的一個(gè),它是一個(gè)自定義行為—設(shè)置一個(gè)快捷鍵。當(dāng)被觸發(fā)的時(shí)候,它使 Xcode 轉(zhuǎn)變到我指定的為下一次開(kāi)發(fā)而優(yōu)化的布局,名為 Dev Mode。我們可以通過(guò)點(diǎn)擊Behavior偏好設(shè)置的左下角的“+”,然后將其取名為Dev Mode,雙擊 Dev Mode 右邊的

符號(hào)然后輸入 Command . 來(lái)定義一個(gè)快捷鍵。



接下來(lái)為該事件設(shè)置相應(yīng)動(dòng)作:

現(xiàn)在,只要你按下command .就會(huì)觸發(fā)上面設(shè)置的動(dòng)作,即出現(xiàn)一個(gè)相同的整潔的開(kāi)發(fā)界面。

下面將介紹 Xcode tab name,和行為配合起來(lái)使用堪稱(chēng)完美。

**Note: **Xcode Tab Names(Xcode標(biāo)簽名):可以通過(guò)雙擊標(biāo)簽頁(yè)的標(biāo)題來(lái)修改標(biāo)簽頁(yè)的名稱(chēng),對(duì)于它本身來(lái)說(shuō)是一個(gè)無(wú)用的功能,但是當(dāng)它和行為結(jié)合起來(lái)使用時(shí)就變得非常強(qiáng)大了。在上面的第二個(gè)例子中,當(dāng)改變Pauses行為時(shí),命名了一個(gè)叫fix的標(biāo)簽頁(yè),這就意味著當(dāng)行為被觸發(fā)時(shí),Xcode將會(huì)使用fix標(biāo)簽頁(yè)(如果存在),如果不存在,它會(huì)新建一個(gè)名為fix的標(biāo)簽頁(yè)。另一個(gè)例子就是多屏Starts行為,如果一個(gè)名為Debug的標(biāo)簽頁(yè)在之前運(yùn)行時(shí)被打開(kāi),它將會(huì)復(fù)用這個(gè)標(biāo)簽頁(yè)而不是重新創(chuàng)建一個(gè)。用這種方式,你可以創(chuàng)建非常有趣的行為。

到現(xiàn)在為止,我們可以花點(diǎn)時(shí)間來(lái)回顧一下剛才的行為,不要著急,本教程會(huì)等著你。

5.小測(cè)驗(yàn)
在接下來(lái)的部分,你將在測(cè)驗(yàn)中用到上面所學(xué)到的技巧,然后在CardTilt項(xiàng)目中學(xué)到一些新的技巧。

運(yùn)行CardTilt項(xiàng)目中,你看到如下畫(huà)面


它不是你期待看到的畫(huà)面?是時(shí)候消滅這些bug了!

5.1鎖定bug
app似乎在加載數(shù)據(jù)時(shí)出現(xiàn)了問(wèn)題,你的任務(wù)就是消滅它們。打開(kāi) CTMainViewController.m 文件然后進(jìn)入開(kāi)發(fā)模式 Dev Mode,快捷鍵為之前設(shè)置的 command .。注意 viewDidload 方法中的前幾行

self.dataSource = [[CTTableViewDataSource alloc] init];
self.view.dataSource = self.dataSource;
self.view.delegate = self;

看起來(lái) CTTableViewDataSource 實(shí)現(xiàn)了 UITableViewDataSource 協(xié)議,為 tableview 提供了數(shù)據(jù)。是時(shí)候展現(xiàn)你 Xcode 的技術(shù)了,按住 command 鍵,同時(shí)點(diǎn)擊 CTTableViewDataSource 在編輯器中打開(kāi)CTTableViewDataSource.h。CTTableViewDataSource.m 應(yīng)該已經(jīng)在你的 Assistant Editor,如果不是這樣的話,打開(kāi)頂部的 Jump Bar,像下圖一一樣切換到 Assistant Editor 的 counterparts 模式。


翻看代碼,你會(huì)發(fā)現(xiàn)數(shù)組 members 裝載數(shù)據(jù),loadData 方法從 bundle 中加載數(shù)據(jù)至數(shù)組 members。在assistant editor 右邊任意位置鼠標(biāo)右擊,選擇 Open in Primary Editor,就會(huì)在 Primary Editor 中打開(kāi) CTTableViewDataSource.m 文件,下面動(dòng)畫(huà)是該步驟的展示:

Note: 為了看起來(lái)更酷炫,你可以在不用鼠標(biāo)的情況下完成上面的所有事情,步驟如下:

1.同時(shí)按住Command + Shift + O,在輸入框中輸入CTMainViewController.m,然后回車(chē)來(lái)打開(kāi)該文件。
2.Command + . 進(jìn)入Enter Dev模式 。
3.將鼠標(biāo)放在 CTTableViewDataSource 上,然后按住Command + Control + J,跳轉(zhuǎn)至CTTableViewDataSource定義處。
4.按住 Command + J, -> 然后按下回車(chē),來(lái)轉(zhuǎn)換 assistant editor 的焦點(diǎn)
5.按住 ctrl +4 來(lái)下拉 Jump Bar,然后使用方向鍵和回車(chē)鍵來(lái)選擇 counterparts
6.按住 Command + Alt,在 primary editor 中打開(kāi) CTTableViewDataSource.m 文件
7.上面的結(jié)果步驟看起來(lái)不呢么高效,但是它讓你看起來(lái)很酷。

5.2 修復(fù)bug
在 self.members = json[@"Team"]; 打上斷點(diǎn)來(lái)確定數(shù)據(jù)是否都被裝載到數(shù)組 members 當(dāng)中,然后運(yùn)行程序。

如果對(duì)于基本的設(shè)置斷點(diǎn)和調(diào)試不太熟悉,可以先看看這篇教程。

就像你之前在 Xcode 行為看到的一樣,Generates output 將首先被觸發(fā),緊接著Pause行為被觸發(fā)。因?yàn)槟阒霸?Pause 有過(guò)自定義設(shè)置,所以 Xcode 會(huì)新建一個(gè)名為 fix 的標(biāo)簽頁(yè),它專(zhuān)為調(diào)試而設(shè)。
將目光切換到變量檢測(cè)器variable inspector,你會(huì)發(fā)現(xiàn)數(shù)組members是nil,在loadData方法數(shù)組members被填充,代碼如下

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
self.members = json[@"Team"];

在變量檢測(cè)器中查看json,看其是否被正確加載,你會(huì)發(fā)現(xiàn)數(shù)據(jù)中的第一個(gè)值是 @"RWTeam" 而不是 @"Team" ,當(dāng)加載數(shù)組 members 時(shí),這個(gè)值是錯(cuò)的,找到了一個(gè)bug。

讓我們按下面步驟來(lái)修復(fù)這個(gè)bug:
(1)使用 Command + .來(lái)進(jìn)入開(kāi)發(fā)模式
(2)按住 Command + Option + J跳至filter bar然后輸入 teammember
(3)然后按住Alt同時(shí)點(diǎn)擊 TeamMembers.json 在 assistant editor 來(lái)打開(kāi)它
(4)最后,使用 "Team" 來(lái)替換 "RWTeam"

下圖是上面四步的一個(gè)動(dòng)畫(huà)

現(xiàn)在移除斷點(diǎn),然后運(yùn)行程序,它看起來(lái)應(yīng)該像這個(gè)樣子。

是不是看起來(lái)比之前要好一點(diǎn)了,但是還是有一些bug,比如Ray和Brian的標(biāo)題描述欄不見(jiàn)了。接下來(lái)我們通過(guò)修復(fù)這些bug來(lái)學(xué)到更多酷炫的技巧。

6.加速
你應(yīng)該已經(jīng)知道 UITableViewCells 在 tableView:cellForRowAtIndexPath: 方法中被加載,所以用 Open Quickly 來(lái)導(dǎo)航到該方法,然后按照下面步驟:
(1)按下Command + Shift + O來(lái)呼出 Open Quickly
(2)輸入cellForRow
(3)按下回車(chē)來(lái)打開(kāi)它

按住 command 然后點(diǎn)擊 setupWithDictionary 來(lái)跳轉(zhuǎn)至其定義處,然后你會(huì)發(fā)現(xiàn)一些用來(lái)加載描述的代碼

NSString *aboutText = dictionary[@"about"]; // Should this be aboot?
self.aboutLabel.text = [aboutText stringByReplacingOccurrencesOfString:@"\n" withString:@"\n"];

它使用 dictionary[@"about"] 中的數(shù)據(jù)來(lái)加載 label。

接下來(lái)呼出 Open Quickly,然后打開(kāi) TeamMembers.json,使用 alt + command 在 Assistant Editor 中打開(kāi)。檢查 about 的值,然后你會(huì)發(fā)現(xiàn)有人將 about 拼寫(xiě)成了 aboot,我們可以使用全局的Find and Replace 來(lái)修復(fù)這個(gè)bug。當(dāng)然你可以在文件中直接做這件事,但是使用 find navigate 看起來(lái)更酷。打開(kāi) find navigate,然后通過(guò)頂部的 jump bar 切換到替換(replace)模式,輸入aboot,然后回車(chē)。


在 TeamMembers.json 文件之外還有一個(gè)地方使用到了aboot,別擔(dān)心,選中 CTCardCell.m 的搜索結(jié)果,然后按下 Delete,將鼠標(biāo)移至 replace filed,然后輸入about,點(diǎn)擊 Replace All,一切完成。整個(gè)過(guò)程看起來(lái)是這個(gè)樣子的:


**Note: **進(jìn)階技巧:使用 Command + Shift + Option + F 來(lái)打開(kāi) Find navigator 的替換模式,如果你嫌麻煩,也可以使用 Command + Shift + F 來(lái)打開(kāi) Find navigator 的查找模式,如果你還嫌麻煩,使用 command + 3 來(lái)打開(kāi) Find navigator,然后開(kāi)啟查找或者替換模式,選擇一種最適合自己的方式就好。

運(yùn)行程序,看起來(lái)是這樣的


7.讓設(shè)計(jì)師高興
今天的調(diào)試任務(wù)到此就結(jié)束了,給自己一點(diǎn)掌聲,然后開(kāi)始運(yùn)行程序。在你將它展示給別人之前,需要先確定app的界面是完美的。尤其當(dāng)這個(gè)人是非常認(rèn)真的設(shè)計(jì)師的時(shí)候,這一部分教你一些關(guān)于interface builder的技巧,讓你變得更酷。

打開(kāi) Mainstoryboard.storyboard,通常你想在打開(kāi) interface builder 的同時(shí)打開(kāi) standard editor 和工具區(qū)(utilities area),所以我們可以自定義一個(gè)新的叫做 IB Mode 的行為,當(dāng)你在看下面的自定義發(fā)放之前,試著自己創(chuàng)建一個(gè)然后自定義,不必要完全一致。


我將這個(gè)模式的快捷鍵設(shè)置為Command Option .,現(xiàn)在你將看到一個(gè)舒服的 Interface Builder 界面,看看 CTCardCell。首先你想讓 mainView 處于 ContentView 的正中央。有兩種技巧可以完成這個(gè)需求:
按住Control + Shift,然后在 mainView 的任意位置鼠標(biāo)左擊,你將看到一個(gè)彈出視圖讓你選擇在光標(biāo)下的所有視圖,如下圖所示:


這個(gè)方法讓你輕松的就能選中 mainView,盡管 cardbg 遮住了它。選中 mainView 之后,按住Alt然后在 ContentView 的邊緣移動(dòng)鼠標(biāo),來(lái)看它們之間的間隔。下面是這個(gè)過(guò)程的一個(gè)動(dòng)畫(huà):


原來(lái)對(duì)其并不是那么優(yōu)雅,看起來(lái)也不是很酷。為了解決這個(gè),我們可以調(diào)整視圖的大小。點(diǎn)擊Editor->Canvas->Live Autoresizing來(lái)使子視圖在父視圖尺寸改變的時(shí)候強(qiáng)制調(diào)整大小。按住Alt同時(shí)拖拽mainView的一角,直到每邊的距離為15.

Note: 拖拽是像素點(diǎn)級(jí)別的技巧,你可以嘗試不同的調(diào)整的處理方法,就像下面動(dòng)畫(huà)一樣。在很多情況下,更傾向于使用Size Inspector來(lái)調(diào)整復(fù)雜的布局,而非用鼠標(biāo)來(lái)拖拽。


試著使用相同的技巧來(lái)對(duì)齊titleLabel、locationLabel、aboutLabel,讓他們豎直方向上的間隔為0。按住Alt來(lái)查看鼠標(biāo)移動(dòng)時(shí),三個(gè)label之間的間隔。有發(fā)現(xiàn)三個(gè)label的左邊緣并沒(méi)有對(duì)齊嗎?設(shè)計(jì)師肯定想讓nameLabel和webLabel靠左對(duì)齊。使用Vertical Guide可以昂我們輕松完成這個(gè)任務(wù)。選中cardbg,然后點(diǎn)擊菜單欄的Editor->Add Vertical Guide,這個(gè)步驟的快捷鍵是Command |,horizontal guide的快捷鍵是Command -,這兩個(gè)快捷鍵是最可視化的。當(dāng)視圖上有了vertical guide之后,將其從cardbg的左邊緣拖10個(gè)點(diǎn)。然后所有視圖將會(huì)緊貼vertical guide,對(duì)的非常整齊,繼續(xù)為其他的label進(jìn)行對(duì)其操作。
Note: Xcode并不那么完美,有時(shí)候可能在你創(chuàng)建guideline的時(shí)候出現(xiàn)一些問(wèn)題,可以打開(kāi)其他文件然后再切回到storyboard頁(yè)面,然后storyboard會(huì)被重新加載,這個(gè)時(shí)候問(wèn)題一般會(huì)自動(dòng)解決。
讓你更酷的建議:所有的視圖能緊貼在guideline上才是最好的,guideline沒(méi)有必要在同一個(gè)層級(jí)。

下圖是上面對(duì)齊過(guò)程的一個(gè)回放:


我敢打賭你現(xiàn)在迫不及待的想把你做的展示給你的設(shè)計(jì)師看!

8.提升和超越
上面的步驟讓你得到了一個(gè)實(shí)用的app,同時(shí)讓你的設(shè)計(jì)師也感到很滿意,那么接下來(lái)我們要做的就是讓代碼變得更為簡(jiǎn)潔。

快速打開(kāi)(Command + Shift + O)CTCardCell.m,記得進(jìn)入Dev Mode(Command .),你應(yīng)該不會(huì)忘了這些快捷鍵吧。

看下 CTCardCell.m 頂部凌亂的屬性列表

@property (weak, nonatomic) IBOutlet UILabel *locationLabel;
@property (strong, nonatomic) NSString *website;
@property (weak, nonatomic) IBOutlet UIButton *fbButton;
@property (weak, nonatomic) IBOutlet UIImageView *fbImage;
@property (strong, nonatomic) NSString *twitter;
@property (weak, nonatomic) IBOutlet UIButton *twButton;
@property (weak, nonatomic) IBOutlet UILabel *webLabel;
@property (weak, nonatomic) IBOutlet UIImageView *profilePhoto;
@property (strong, nonatomic) NSString *facebook;
@property (weak, nonatomic) IBOutlet UIImageView *twImage;
@property (weak, nonatomic) IBOutlet UILabel *aboutLabel;
@property (weak, nonatomic) IBOutlet UIButton *webButton;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;

在這部分,你將創(chuàng)建一個(gè)自定義服務(wù)以執(zhí)行腳本命令來(lái)實(shí)現(xiàn)屬性的快速整齊地排列。

Note: 如果對(duì)于這些腳本命令還不熟悉,它們是相當(dāng)好理解的。排序(sort)是按照字母順序來(lái)的,uniq是會(huì)刪除所有重復(fù)的行數(shù)。uniq在這里可能派不上用場(chǎng),但是用它來(lái)管理#import,那是極好的。
Mac OS X允許你創(chuàng)建整個(gè)操作系統(tǒng)全局通用的服務(wù),你將用它來(lái)創(chuàng)建一個(gè)用在Xcode中的腳本服務(wù),按如下步驟來(lái)設(shè)置:
(1)使用Spotlight來(lái)搜索Automator,并打開(kāi)它
(2)然后點(diǎn)擊File->New,并選擇服務(wù)(service)一項(xiàng)
(3)在Actions篩選欄,輸入shell,然后雙擊運(yùn)行shell腳本Run Shell Script
(4)在新添加的服務(wù)的菜單欄上,檢查Output replaces selected text
(5)將腳本內(nèi)容切換至sort | uniq
(6)同時(shí)按下command s,將服務(wù)保存為 Sort & Uniq

最終的窗口看起來(lái)是這個(gè)樣子:

切回到Xcode,然后選中 CTCardCell.m 中的那片混亂的屬性區(qū)域,右擊,選擇 Services -> Sort & Uniq,然后觀察執(zhí)行之后代碼是多么的整潔。你可以看下面的一個(gè)示意圖:


9.代碼片段
進(jìn)行到這里,意味著那些基本的可以讓你看起來(lái)酷酷的調(diào)試任務(wù)已經(jīng)告一段落了,接下來(lái)我希望你覺(jué)得更酷。你可定想學(xué)更多技巧,幸運(yùn)的是,這是最后分享的一個(gè)技巧。

你之前可能已經(jīng)使用過(guò)Xcode的代碼片段(Code Snippets)功能了,一些常見(jiàn)的是for in片段和dispatch_after片段。在這一部分,你將學(xué)會(huì)如何創(chuàng)建自定義的代碼片段,當(dāng)你重用這些代碼片段時(shí),看起來(lái)非常棒。你將創(chuàng)建的是獲取單例的代碼片段。

如果你不熟悉單例模式,可以看看這個(gè)教程。

下面可能是你使用單例模式的常用代碼模板

  • (instancetype)sharedObject {
    static id _sharedInstance = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
    _sharedInstance = [[self alloc] init];
    });
    return _sharedInstance;
    }

非常酷的是這份片段也包含了dispatch_oncep片段。

在工程CardTilt創(chuàng)建一個(gè)名為繼承自NSObject名為SingletonObject的新類(lèi),你不需要為它做任何事,除了作為拖拽代碼片段的一個(gè)地方。

按下面步驟:
(1)在 @implementation 的下一行粘貼上面的代碼到 SingletonObject.m
(2)用快捷鍵Command Option Control 2來(lái)打開(kāi)代碼片段庫(kù),在代碼片段庫(kù)中你會(huì)看到默認(rèn)的包含在Xcode中的代碼片段庫(kù)。
(3)選中整個(gè)+sharedObject方法,將其拖拽到代碼片段庫(kù)中。

看起來(lái)是這樣的:


新創(chuàng)建的代碼片段將會(huì)在代碼片段庫(kù)的最底部,你可以將其拖拽到任何你想拖拽的文件當(dāng)中去,讓我們來(lái)嘗試一下。

雙擊剛剛新建的代碼片段,然后點(diǎn)擊edit.彈出的視圖非常使用,實(shí)際上它們都很重要,所以做個(gè)簡(jiǎn)短的解釋。

(1)Title and Summary:代碼片段庫(kù)中該代碼片段的名字和簡(jiǎn)述
(2)Platform and Language:代碼片段匹配的平臺(tái)和編程語(yǔ)言
(3)Completion Shortcut:在Xcode中輸入的快捷鍵
(4)Completion Scopes:代碼片段作用的范圍,這對(duì)于保持代碼片段庫(kù)整潔來(lái)說(shuō)十極好的。

向下面一樣填充里面的屬性:


9.1令牌
當(dāng)你加入令牌時(shí),代碼片段將會(huì)變得非常強(qiáng)大,因?yàn)樗试S你在片段中標(biāo)記代碼,而不需要硬編碼。通過(guò)使用Tab鍵使得他們非常容易修改,就像自動(dòng)補(bǔ)全一樣。

在片段中僅僅只要輸入 <#TokenName#> 就可以添加一個(gè)令牌,創(chuàng)建一個(gè)令牌使用 shared<#ObjectName#>替代sharedObject ,看起來(lái)像這樣:


點(diǎn)擊 Done 來(lái)保存該片段,然后來(lái)用用它。

在 SingletonObject.m 文件中輸入 singleton accessor,然后當(dāng)它出現(xiàn)的時(shí)候使用自動(dòng)補(bǔ)全


對(duì)于經(jīng)常使用的代碼來(lái)說(shuō),創(chuàng)建一個(gè)代碼片段是非常實(shí)用的。

10.何去何從
總結(jié)一下在這個(gè)教程中你所學(xué)到的東西:
(1)使用快捷鍵來(lái)改變Xcode的布局
(2)使用自定義的行為來(lái)改變Xcode的布局
(3)使用assistant editor
(4)在Xcode中快速打開(kāi)某文件
(5)在Find navigator刪除搜索到的結(jié)果
(6)在Interface Builder使用快捷鍵和guideline來(lái)對(duì)齊視圖
(7)創(chuàng)建一個(gè)在Xcode中使用的服務(wù)
(8)創(chuàng)建并使用自定義的代碼片段
(9)最重要的是你知道怎么去成為一名Xcode大師

上面列出來(lái)的內(nèi)容都很簡(jiǎn)單對(duì)吧?在你的朋友面前展示這些炫酷的技巧,你的朋友一定會(huì)驚呆也會(huì)理解你的興奮。還有很多方法可以提高你的Xcode的效率,比如:
使用Doxygen風(fēng)格的注釋
使用Xcode插件

下一步就是去尋找新的酷炫的技巧,我希望你能享受整個(gè)教程的學(xué)習(xí)過(guò)程,如果你有任何問(wèn)題、評(píng)論、或者想分享你所知道的炫酷技巧,請(qǐng)?jiān)谙旅嬖u(píng)論中指出。

http://www.cocoachina.com/ios/20140731/9284.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【轉(zhuǎn)載】曾夢(mèng)想仗劍走天涯 1.Xcode IDE概覽 說(shuō)明:從左到右,依次是“導(dǎo)航窗格(Navigator)->邊...
    06a6a973d7ab閱讀 4,058評(píng)論 2 20
  • 1.Xcode IDE概覽 說(shuō)明:從左到右,依次是“導(dǎo)航窗格(Navigator)->邊列(Gutter)->焦點(diǎn)...
    小地閱讀 5,474評(píng)論 0 9
  • 在Xcode 6中有許多快捷鍵的設(shè)定可以使得你的編程工作更為高效,對(duì)于在代碼文件中快速導(dǎo)航、定位Bug以及新增應(yīng)用...
    PlatonsDream閱讀 19,418評(píng)論 1 11
  • 因?yàn)橐Y(jié)局swift3.0中引用snapKit的問(wèn)題,看到一篇介紹Xcode8,swift3變化的文章,覺(jué)得很詳細(xì)...
    uniapp閱讀 4,859評(píng)論 0 12
  • 踏著回鄉(xiāng)的步履,心里微波蕩漾著激動(dòng),無(wú)聊之中又蘊(yùn)含著一絲絲愜意,不知道故鄉(xiāng)有沒(méi)有什么變化,思索著自己在家里種的幾株...
    颯颯華風(fēng)閱讀 372評(píng)論 0 0

友情鏈接更多精彩內(nèi)容