iOS開發----TableView的點擊,選中等效果

本文講的是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)
複製代碼
相關文章
相關標籤/搜索