Swift纯Code之旅 Day11. 「TableView(3) - 实作Delegate & DataSource」

前言

昨天已经将 addAlarmTableViewCell 在 addAlarmTableView 中注册完毕了,
今天要试着实作 Delegate & DataSource,让他可以正常显示。

实作TableView Delegate & DataSource

首先,需要知道该TableView要由哪个ViewController使用,因此我们必须在addAlarmViewController实作加入以下程序码,
表示 addAlarmTableView 要由 addAlarmViewController实作:

// addAlarmTableView 的 delegate 由目前的ViewController实作
self.addAlarmTableView.delegate = self
// addAlarmTableView 的  由目前的ViewController实作
self.addAlarmTableView.dataSource = self

这时候Xcode会跳出错误:
https://ithelp.ithome.com.tw/upload/images/20210921/20108999pSlT5Uvph1.png

这个错误意思是,addAlarmTableView 已经知道会由 addAlarmViewController 使用了,
但是 addAlarmViewController 并没有遵守 TableView Delegate & DataSource 的协议,

Q:那要如何遵守协议呢?

A:

  1. 回到 AddAlarmViewController的开头,在 AddAlarmViewController 後面加上 UITableViewDelegate & UITableViewDataSource

加完後就代表addAlarmViewcontroller已经遵守这两个协议了

class AddAlarmViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
  1. 遵循协议後,Xcode会继续报错误:
    https://ithelp.ithome.com.tw/upload/images/20210921/201089998hBF9G3hIR.png

这个错误的意思是:您已遵守协议,但协议中有必须实作的Function或是变数,
此时只要按下错误中的「Fix」按钮,就会将必须实作的Function或是变数Show出来了
https://ithelp.ithome.com.tw/upload/images/20210921/20108999cpzBbYkRv3.png

  1. 实作Function

首先可以看到第一个Function:「numberOfRowsInSection」
这个Function的功能是:一个Section内要显示几个Cell?
参考一下IPhone的闹钟介面:
https://ithelp.ithome.com.tw/upload/images/20210921/20108999dg8NSVanlr.jpg

那这次我们总共只需要显示4个就好,因此可以先将要显示的title跟Details给写成一个阵列:

let addAlarmTitles = ["重复","标签","提示声","重复提醒"]
var addAlarmDetails = ["永不","闹钟","雷达"]

之後在「numberOfRowsInSection」内加上以下程序码:

  • 表示回传「addAlarmTitles」的阵列大小,也就是4
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return addAlarmTitles.count
    }

接着实作第二个Functilon:「cellForRowAt」
这个Function的功能是:给个Cell要显示什麽内容?
因此在里面加上以下程序码:

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]
            
        // 设定Cell的contentLabel内容
        cell.contentLabel.text = addAlarmDetails[indexPath.row]
    }

以上程序码意思如下:
https://ithelp.ithome.com.tw/upload/images/20210921/20108999mC7HYOECag.png


设定完毕後执行程序看看吧!
https://ithelp.ithome.com.tw/upload/images/20210926/20108999GTAgakIfpe.png

会发现有东西是有了,但是长得好像怪怪的?
这时候再给他Cell的大小即可

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }

再执行看看吧!
https://ithelp.ithome.com.tw/upload/images/20210926/20108999pSm2Qc3GFH.png

越来越像IPhone内建闹钟了呢/images/emoticon/emoticon02.gif


<<:  day6: CSS style 规划 - CSS in js

>>:  Day9 random 乱数方法

Day8-Go阵列Array

前言 阵列是一种资料结构,里面装载的资料必须是同性质的,不能同时装载着字串又装载着整数,且建立後阵列...

从登入画面开始做起(下)Day4

今天做昨天说到file owner的详细实作方法 1. 将设计好的Xib的file owner属性添...

[Day 11]从零开始学习 JS 的连续-30 Days---函式基础

函式应用基础 函式基本语法格式: function+函式的名称+小括号( )+大括号{ }。 小括号...

Day12 Redis应用实战-String操作

启动Redis Server # 复制安装档内的redis.conf 到自己指定的路径下 cp /h...

[Day 19] tinyML开发好帮手─云端一站式平台Edge Impulse简介

自从上次在街边吃了一碗不怎麽地「杂碎面」,咖哩鱼蛋没鱼味,咖哩又不入味,失败!猪皮煮得太烂,没咬头,...