IOS 8編程入門--使用swift語言 專題目錄:
第二章:使用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用做參考。?