本文講的是TableView點擊效果。swift
專業完整版請參考(www.appcoda.com/learnswift/)數組
上面網址的教程文檔爲試用版,須要購買。(支持正版從我作起💪)app
各位看官注意啦,本文章不是教程,只是個人一個分享而已,有錯誤還請指出。ide
一樣先上效果圖函數
接下來咱們開始!
post
注意本文是基於iOS 12和Xcode 10
本章是在基礎篇的代碼作出的修改,若是未完成,還請先看基礎篇。
(juejin.im/post/5d23e3…)spa
添加一個函數,當發生點擊的時候調用這個函數,並對它進行填充。rest
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let optionMenu = UIAlertController(title: nil, message: "what do you want to do", preferredStyle: .actionSheet)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
optionMenu.addAction(cancelAction)
present(optionMenu, animated: true, completion: nil)
}
複製代碼
咱們再打開模擬器,看看效果如何 code
固然你也能夠作本身想要的效果。cdn
若是你想要另外種彈唱的方式能夠修改optionMenu中的preferredSyle,相對應的若是要修改按鈕(Cancel)的效果,點擊cancel中的style。
若是以爲有能力的能夠繼續完成一個練習:當我點擊Call時,彈出另外一個對話框。
代碼我會在本文最後貼出。
這裏咱們要實現的是多選功能,一樣要在tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)這個函數中進行,一樣十分簡單隻須要幾行代碼就能夠。
let CheckAction = UIAlertAction(title: "Check in", style: .default, handler: {(action: UIAlertAction) -> Void in
let cell = tableView.cellForRow(at: indexPath)
cell?.accessoryType = .checkmark
})
optionMenu.addAction(CheckAction)
複製代碼
再次開啓模擬器,咱們會驚奇的發現雖然確實能夠選擇,可是當咱們下滑時候,下面未選擇的列表行也有被選中。
再次上滑時,發現有選中標記的可能不是咱們剛纔選中的那個列表行了!
這是一個Bug! 緣由是在iOS開發中,列表並不會創建你所要求的個數,而是在上下滑動的時候重複利用。
好比你數組裏面有30個放入列表中,但列表不會創建30個而是可能只創建10個或者其餘個數,在上下滑動重複利用,這是爲了節省計算機的資源但同時也是形成咱們如今的狀況的緣由。
如同教學文檔中所說的同樣,我討厭Bug但不能躲避它。
Bug對提高咱們的技術幫助是十分大的。
面對這樣的設置,咱們的解決方法是設置一個數組,若是選中則變爲true不然爲false。 因此咱們先在整個類下定義一個布爾值的數組resraurantIsVisited.
以後在tableView(_ didSelectRowAt:)中函數中添加一串代碼
self.restaurantIsVisited[indexPath.row] = true
複製代碼
同時在tableView(_ cellForRowAt:)中添加斷定代碼,爲了去除未選中的列表行。
if restaurantIsVisited[indexPath.row]{
cell.accessoryType = .checkmark
} else {
cell.accessoryType = .none
}
複製代碼
再次啓動模擬器,選中在滑動發現問題解決了!
至此本文主要內容已經所有結束,你們能夠思考這幾個問題。
1.點擊選中的列表行時Check in變成Undo Check,點擊Undo Check取消選中。
2.如今選中的列表行是一個打勾的標記,嘗試修改爲其餘標記。
最後貼出以前練習添加多個代碼框的代碼:
let CallActionHandler = {(action: UIAlertAction) -> Void in
let alertMessge = UIAlertController(title: "Service Unavailable", message: "Sorry, the call feature is not available yet. Please retry later", preferredStyle: .alert)
alertMessge.addAction(UIAlertAction(title: "OK", style: .default, handler: nil) )
self.present(alertMessge, animated: true, completion: nil)
}
let CallAction = UIAlertAction(title: "Call" + "123-000-\(indexPath.row+1)", style: .default, handler: CallActionHandler)
optionMenu.addAction(CallAction)
複製代碼