第八章 表格單元格選取以及UIAlertController(二)

IOS 8編程入門--使用swift語言 專題目錄:

IOS 8 開發(fā)入門--序言(一)

IOS 8 開發(fā)入門--序言(二)

第一章:創(chuàng)建你的第一個App(一)

第一章:創(chuàng)建你的第一個App(二)

第二章:使用Storyboard設(shè)計用戶界面(一)

第二章:使用Storyboard設(shè)計用戶界面(二)

...............

第七章? 使用prototype Cell定制Table View(一)

第七章? 使用prototype Cell定制Table View(二)

第八章 表格單元格選取以及UIAlertController(一)

全書完整目錄

接上一章

我們可以用UIAlertControllerStyle.ActionSheet或者UIAlertControllerStyle.Alert方法應(yīng)用這兩個值。所以當(dāng)創(chuàng)建UIAlertController時可以使用如下代碼:

上面的代碼沒有什么錯誤。Swift向開發(fā)者提供一種縮寫方式可以幫助我們少敲代碼晒他。因為preferred Style參數(shù)的類型我們已經(jīng)知道(即UIAlertControllerStyle),Swift允許我們使用一種省略UIAlertControllerStyle的短點號語法秩霍。這就是為什么用下面的代碼實例化UIAlertControllerm

為Alert Controller添加Action

現(xiàn)在舆乔,讓我們添加兩個Action到alert controller:

“Call”action:呼叫選中的餐館采郎。我們提前準(zhǔn)備一個假的電話號碼并且顯示“Call 123-000-x”

“I’ve been here“action:當(dāng)被選中時,給被選中的餐館添加一個標(biāo)簽。

在tableView(_:didSelectRowAtIndexPath:)方法中每聪,為Call action添加下面的代碼。你可以在Cancel action后面插入下面的代碼:

這部分代碼中callActionHandler對你來說是陌生的齿风。當(dāng)創(chuàng)建一個UIAlerAction對象時药薯,我們可以指定一段代碼塊作為處理函數(shù)。當(dāng)用戶選擇這個Action時這段代碼塊將會被執(zhí)行救斑。這里這段代碼塊顯示一個警告童本,告知我們呼叫功能不可用。

在Swift中脸候,代碼塊被稱為閉包穷娱。閉包是包含一定功能的函數(shù)塊绑蔫,它可以在代碼中傳遞。這和Objective-C中的塊很相似泵额。有一種提供閉包的方法是像聲明變量一樣聲明帶有常量或變量的代碼塊配深,就像上面的例子。代碼塊開始的部分是標(biāo)識嫁盲,它定義了處理函數(shù)的參數(shù)篓叶,這里是UIAlertAction。In關(guān)鍵字暗示閉包的參數(shù)定義和返回類型定義完畢羞秤,閉包的體部分開始缸托。圖說明閉包的語法。

UIAlertAction的標(biāo)題是一個假的電話號碼瘾蛋。它由“123-000-”加上被選中的行號形成俐镐。如你從代碼中看到的,Swift允許開發(fā)者用加法符號+連接字符串哺哼。另外佩抹,你可以從整數(shù)或者其他符號創(chuàng)建字符。你只需要用一對圓括號包起來并且在前面添加一個反斜杠幸斥,像這樣:

“Call“+“123-000-\(indexPath.row”

下面是Call Action的實現(xiàn)匹摇,添加下面的代碼實現(xiàn)”I’ve been here”action:

上面的代碼為你顯示了另一種使用閉包的方法咬扇。你可以將閉包直接寫到函數(shù)的參數(shù)處甲葬。這種使用方法更受歡迎,因為它更清晰并且可讀性較高懈贺。

Swift中的可選類型(Optionals)

你可能奇怪代碼中的经窖?是什么意思。Cell是Swift中的可選類型(optional)梭灿』拢可選類型是Swift新引進的類型”ざ剩可選的意思是“有值”或者”沒有值“配乱。由tableView.cellForRowAtIndexPath返回的cell是一個可選值。為了訪問cell的附屬類型屬性皮迟,你要使用問號搬泥?。在這種情況下伏尼,Swift將檢查cell是否存在并且在存在時允許你設(shè)置附屬類型屬性值忿檩。在大多數(shù)情況下,Xcode的自動完成功能在你訪問一個可選類型的屬性時將為你添加問號爆阶。像了解更多關(guān)于Optionals的知識燥透,你可以閱讀參考手冊沙咏。

當(dāng)用戶在餐館中選擇”I’ve been here”,我們會為被選中的cell添加選中標(biāo)簽班套。對于一個表格單元格肢藐,它的右邊是保留給附屬視圖的。有4種類型的附屬視圖顯示指示器(disclosure indicator)吱韭,細節(jié)顯示按鈕(detail disclosure button),選中標(biāo)志(checkmark)和細節(jié)(detail)窖壕。在這個例子中,我們使用選中標(biāo)志作為指示器杉女。在代碼的第一行使用indexPath獲取被選中的表格單元格瞻讽。第二行用選中標(biāo)志更新單元格的附屬類型屬性。

編譯并且運行App熏挎。點擊餐館名并且選擇任何一個動作(action)速勇,App要么顯示一個選中標(biāo)志要么顯示一個警告。

到現(xiàn)在為止坎拐,當(dāng)你選擇某行烦磁,該行會呈現(xiàn)亮灰色并且處于選中狀態(tài)。在ableView(_:didSelectRowAtIndexPath:)方法的最后添加下面的代碼取消行選中哼勇。

我們遇到了一個Bug

這個App看起來不錯都伪。但是如果你仔細看,App中存在一個Bug积担。如果你使用”I’ve been here”action標(biāo)記“Cafe Deadend”餐館陨晶。如果你向下翻表格,你會發(fā)現(xiàn)令一個餐館(例如:Palomino Espresso)也包含一個選中標(biāo)志帝璧。這是什么問題呢先誉?為什么App會增加一個額外的選中標(biāo)志。這個問題和我們在前面章節(jié)里討論的單元格復(fù)用有關(guān)的烁。假設(shè)UITableView需要顯示30個單元格褐耳。基于性能的原因渴庆,UITableView可能只創(chuàng)建10個單元格然后在表格滾動時復(fù)用它們铃芦。在這個例子里,UITableView復(fù)用了第一個單元格(原來用來顯示選中的Cafe Deadend)用于顯示令一個餐館襟雷。在我們的代碼中刃滓,當(dāng)表格重用單元格時我們只更新了圖片和標(biāo)簽。附屬圖標(biāo)沒有更新嗤军。因此下一個餐館重用了一個有一樣附屬圖標(biāo)的單元格注盈。如果附屬圖標(biāo)包含選中標(biāo)志,則新的餐館也會帶著一個選中標(biāo)志叙赚。

我們該如何解決這個bug呢老客?

我們需要找另一個方法來保存餐館的選中狀態(tài)僚饭。例如,創(chuàng)建令一個數(shù)組來保存選中的餐館胧砰?在RestaurantTableViewController.swift中鳍鸵,聲明一個Boolean數(shù)組:

varrestaurantIsVisited = [Bool](count:21, repeatedValue:false)

在Swift中Bool是一種用于儲存布爾值的數(shù)據(jù)類型。Swift提供兩種Boolean值尉间,true和false偿乖。我們聲明restaurantIsVisited數(shù)組存儲一個Boolean值的集合。數(shù)組中每一個值都指示對應(yīng)的餐館是否被標(biāo)記為”I’ve been here”哲嘲。例如贪薪,我們可以通過查看restaurantIsVisited[0]的值來看”Cafe Deadend”是否被選中。

數(shù)組的初始值被設(shè)置為全false眠副。換句話說画切,默認情況下餐館沒有被選中。上面的代碼說明了在Swift中一種初始化具有重復(fù)值的數(shù)組的方法囱怕。它和下面的初始化語句是一樣的:

修復(fù)這個Bug我們需要修改一些代碼霍弹。首先當(dāng)某個餐館被選中了我們需要更新Boolean數(shù)組中對應(yīng)的值。在處理函數(shù)isVisited Action中添加一行代碼:

這行代碼非常簡單娃弓。我們在餐館被選中時將相應(yīng)的值從false修改為true典格。最后,添加一些代碼在tableView(_:cellForRowAtIndexPath:)方法”return cell”之前台丛,用于更新附屬圖像耍缴。

在這里我們檢查餐館是否要顯示被選中。如果條件為true齐佳,我們在單元格中顯示選中私恬。否則,什么也不顯示炼吴。

好了,重新編譯并運行App疫衩。Bug現(xiàn)在被修復(fù)了硅蹦。

其實你可以用三元條件操作符(? :)將上面的if條件語句簡化為一行代碼。三元條件操作符是簡化簡單條件的有效方法闷煤。

你的練習(xí)

現(xiàn)在的App不允許用戶取消選中童芹。思考一下你如何修改代碼使得App能夠觸發(fā)選中標(biāo)簽。當(dāng)單元格是選中狀態(tài)的時候鲤拿,你同樣需要顯示一個不同于”I’ve been there”的標(biāo)簽假褪。這個功能并不是很難。

如果你需要更多的挑戰(zhàn)近顷,你可以嘗試把UI做的更好生音。不使用默認的選中標(biāo)簽宁否,用一個心形圖標(biāo)替代(或者其他你喜歡的圖標(biāo))。提示一下你需要定制prototype單元格包括圖標(biāo)和設(shè)置圖標(biāo)的隱藏屬性缀遍,當(dāng)隱藏屬性被設(shè)置為false的時候可以隱藏圖標(biāo)慕匠。這里是示例代碼:

iconImageView.hidden= false

花一些時間做一下這個練習(xí)。我相信你會學(xué)到很多域醇。

小結(jié)

到現(xiàn)在為止台谊,你對創(chuàng)建表格,定制單元格和處理表格行選中譬挚,已經(jīng)有了深入的了解了锅铅。你可以創(chuàng)建你自己的簡單表格App了。是的减宣,開始做你自己的項目狠角。不需要多大。例如蚪腋,假設(shè)你喜歡旅游丰歌,那你可以創(chuàng)建一個簡單的App顯示一系列你喜歡的目的地。如果你喜歡音樂屉凯,那可以創(chuàng)建一個App顯示你喜歡的歌曲立帖。盡情的使用Xcode,不斷犯錯悠砚,不斷學(xué)習(xí)晓勇。

你可以下載 http://pan.baidu.com/s/1skWyPOx 完整的Xcode項目FoodPinCellSelection.zip用做參考。?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灌旧,一起剝皮案震驚了整個濱河市绑咱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枢泰,老刑警劉巖描融,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衡蚂,居然都是意外死亡窿克,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門毛甲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來年叮,“玉大人,你說我怎么就攤上這事玻募≈凰穑” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵七咧,是天一觀的道長跃惫。 經(jīng)常有香客問我叮叹,道長,這世上最難降的妖魔是什么辈挂? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任衬横,我火速辦了婚禮,結(jié)果婚禮上终蒂,老公的妹妹穿的比我還像新娘蜂林。我一直安慰自己,他們只是感情好拇泣,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布噪叙。 她就那樣靜靜地躺著,像睡著了一般霉翔。 火紅的嫁衣襯著肌膚如雪睁蕾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天债朵,我揣著相機與錄音子眶,去河邊找鬼。 笑死序芦,一個胖子當(dāng)著我的面吹牛臭杰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谚中,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼渴杆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宪塔?” 一聲冷哼從身側(cè)響起磁奖,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎某筐,沒想到半個月后比搭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡来吩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年敢辩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弟疆。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盗冷,靈堂內(nèi)的尸體忽然破棺而出怠苔,到底是詐尸還是另有隱情,我是刑警寧澤仪糖,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布柑司,位于F島的核電站迫肖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏攒驰。R本人自食惡果不足惜蟆湖,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玻粪。 院中可真熱鬧隅津,春花似錦、人聲如沸劲室。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽很洋。三九已至充蓝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喉磁,已是汗流浹背谓苟。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留协怒,地道東北人涝焙。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像斤讥,于是被迫代替她去往敵國和親纱皆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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