iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

30天Swift純Code之旅 - 鬧鐘篇系列 第 13

Swift純Code之旅 Day13. 「TableView(4) - 使用兩個TableViewCell」

前言

現在我們就差第四個欄位需要讓他有開關的效果,由於這邊是使用TableView實作的,
因此我打算使用兩個TableViewCell來達到這個效果:

建立第二個 TableViewCell

首先建立一個TableViewCell,並命名為:「AddAlarmButtonTableViewCell」
一樣建立這個TableViewCell的識別碼

static let identifier = "addAlarmButtonTableViewCell"

一樣建立一個Label,並設定Layout對齊螢幕左邊間隔10

// 建立Label
let titleLabel: UILabel = {
    let label = UILabel()
    label.textColor = .white
    return label
}()
    
// Layout
titleLabel.snp.makeConstraints { make in
    // titleLabel 的頂部跟底部貼齊TableViewCell的頂部跟底部
    make.top.bottom.equalTo(self)
    // titleLabel 的左邊距離TableViewCell的左邊間隔10
    make.leading.equalTo(self).offset(10)
}

一樣去更改昨天說的accessoryView,這次使用UISwitch去更改

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.backgroundColor = #colorLiteral(red: 0.1734634042, green: 0.1683282256, blue: 0.1771324873, alpha: 1)
        // 設定accessoryView 為 UISwitch
        self.accessoryView = UISwitch(frame: .zero)
        setViews()
        setLayouts()
    }

這邊TableViewCell的設定就完成囉。


實作一個TableView使用兩個TableViewCell

讓我們看到之前做的TableView Delegate 內的 cellForRowAt():

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // 告知TableView要使用哪個Cell
        guard let cell = tableView.dequeueReusableCell(withIdentifier: AddAlarmContentTableViewCell.identifier, for: indexPath)
                as? AddAlarmContentTableViewCell else { return UITableViewCell() }

        // 設定Cell的TitleLabel內容
        cell.titleLabel.text = addAlarmTitles[indexPath.row]
        return cell
    }

由於現在要使用兩個Cell,因此必須要在 cellForRowAt() 動點手腳
( 這邊使用Switch Case )

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        switch indexPath.row {
        
        // 當TableView顯示到第四欄時,顯示剛剛新增的AddAlarmButtonTableViewCell
        case 3:
            
            // 告知TableView要使用哪個Cell
            guard let cell = tableView.dequeueReusableCell(withIdentifier: AddAlarmButtonTableViewCell.identifier, for: indexPath) as? AddAlarmButtonTableViewCell else { return UITableViewCell() }
            
            // 設定Cell的TitleLabel內容
            cell.titleLabel.text = addAlarmTitles[indexPath.row]
            return cell
            
        // 其他的欄位,顯示之前新增的AddAlarmContentTableViewCell
        default:
            
            // 告知TableView要使用哪個Cell
            guard let cell = tableView.dequeueReusableCell(withIdentifier: AddAlarmContentTableViewCell.identifier, for: indexPath)
                    as? AddAlarmContentTableViewCell else { return UITableViewCell() }

            // 設定Cell的TitleLabel內容
            cell.titleLabel.text = addAlarmTitles[indexPath.row]
            
            // 設定Cell的contentLabel內容
            cell.contentLabel.text = addAlarmDetails[indexPath.row]
            return cell
        }

由於我們是第四個欄位才需要讓Accessory顯示開關按鈕,因此使用Switch Case判斷,
當跑到第四個欄位時,就顯示剛剛新增的addAlarmButtonTableViewCell。

現在執行看看吧!
https://ithelp.ithome.com.tw/upload/images/20210923/20108999XZOVMrDHdy.png

爆掉啦! 讓我們仔細看一下這個Error的訴求
這個Error是在訴說:剛剛新增的「addAlarmButtonTableViewCell」必須要被這個TableView給註冊過,
不然會不認得他,那麼馬上來註冊吧!

let addAlarmTableView: UITableView  = {
        let tableView = UITableView()
        // 註冊 addAlarmContentTableViewCell
        tableView.register(AddAlarmContentTableViewCell.self,
                           forCellReuseIdentifier: AddAlarmContentTableViewCell.identifier)
        
        // 註冊 addAlarmButtonTableViewCell
        tableView.register(AddAlarmButtonTableViewCell.self,
                           forCellReuseIdentifier: AddAlarmButtonTableViewCell.identifier)
        
        tableView.bounces = false
        return tableView
    }()

接著再在執行看看

終於/images/emoticon/emoticon02.gif


上一篇
Swift純Code之旅 Day12. 「TableView(番外篇) - TableViewCell Accessory」
下一篇
Swift純Code之旅 Day14. 「TableView(5) - 點擊TableViewCell」
系列文
30天Swift純Code之旅 - 鬧鐘篇30

尚未有邦友留言

立即登入留言