Swift纯Code之旅 Day30. 「新增闹钟功能(最终章) - 分手快乐」

前言

昨天我们已经完成使用Delegate回传值到首页的部分了,那今天就要来完成最後一个步骤:

如何让回传回来的资料显示在画面中

马上开始吧!

实作

  1. 闹钟首页显示的闹钟可以有多个,因此我们这边先宣告一个型态为「AddAlarmInfo」阵列
var alarmDatas: [AddAlarmInfo] = []
  1. 接下来在刚刚接收回传值的地方,将这些回传值给加入「alarmDatas」阵列内
extension AlarmViewController: UpdateAlarmListDelegate {
    
    func updateAlarmList(alarmData: AddAlarmInfo) {
        
        // 将回传回来的闹钟资讯加入该阵列内
        self.alarmDatas.append(alarmData)
    }
}
  1. 修改TableView Delegate中的「numberOfRowsInSection」、「cellForRowAt」

numberOfRowsInSection:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        switch section {
        case 0:
            // 第一个Section下显示一个Cell即可
            return 1
        case 1:
            // 第二个Section显示的Cell数量为:alarmDatas阵列的成员个数
            return alarmDatas.count
        default:
            // 其余不显示任何Cell
            return 0
        }
    }
cellForRowAt:
case 1:
            // 将实作的AlarmOtherTableViewCell实体化,并显示於第二个Section的画面上
            guard let cell = tableView.dequeueReusableCell(withIdentifier: AlarmOtherTableViewCell.identifier, for: indexPath) as? AlarmOtherTableViewCell else { return UITableViewCell() }
            
            // 每个cell的alarmTimeLabel的文字内容 放入 相对应「alarmDatas」的time
            cell.alarmTimeLabel.text = alarmDatas[indexPath.row].time
            // 每个cell的alarmNoteLabel的文字内容 放入 相对应「alarmDatas」的annotation
            cell.alarmNoteLabel.text = alarmDatas[indexPath.row].annotation
            
            return cell
  1. 这时候会发现有Error:
    https://ithelp.ithome.com.tw/upload/images/20211010/20108999eW241TH4NZ.png

OH~ 原来是「alarmDatas」阵列内的time是属於Date型别,Date型别无法放入Label的文字内,
因此我们必须要做一个Date转换为String的动作。

  1. 新增一个将Date转换为String的Function
// 实作Function:「dateToString」,一共有两个参数
// 第一个date  是: 要转换的时间
// 第二个format是: 要转换爲何种时间格式
func dateToString(date: Date, format: String) -> String {
      
    // 宣告dateFormatter
    let dateFormatter = DateFormatter()
        
    // 设定要转换的时间格式为: 带入的参数「format」
    dateFormatter.dateFormat = format
        
    // 将时间转换为字串後回传
    return dateFormatter.string(from: date)
        
}
  1. 将它使用在TableView Delegate中的「cellForRowAt」内
case 1:
            // 将实作的AlarmOtherTableViewCell实体化,并显示於第二个Section的画面上
            guard let cell = tableView.dequeueReusableCell(withIdentifier: AlarmOtherTableViewCell.identifier, for: indexPath) as? AlarmOtherTableViewCell else { return UITableViewCell() }
            
            // 每个cell的alarmTimeLabel的文字内容放入
            // 相对应「alarmDatas」的time
            cell.alarmTimeLabel.text = dateToString(date: alarmDatas[indexPath.row].time, format: "HH:mm")
            
            // 每个cell的alarmNoteLabel的文字内容放入
            // 相对应「alarmDatas」的annotation
            cell.alarmNoteLabel.text = alarmDatas[indexPath.row].annotation
            
            return cell

执行看看吧!

/images/emoticon/emoticon16.gif/images/emoticon/emoticon16.gif/images/emoticon/emoticon16.gif/images/emoticon/emoticon16.gif怎麽失败了呢?

原因是当你更改「alarmDatas」阵列的值後,并没有人通知TableView已经更改值了,要更新画面了
因此加入以下程序码,通知TableView该刷新画面罗!

    var alarmDatas: [AddAlarmInfo] = [] {
        // didSet的意思是:当这个变数被变更时,执行以下动作
        didSet {
            
            // TableView的画面更新
            alarmTableView.reloadData()
        }
    }

再执行看看吧!

/images/emoticon/emoticon54.gif/images/emoticon/emoticon54.gif/images/emoticon/emoticon54.gif/images/emoticon/emoticon54.gif
成功啦!!!


这次铁人赛也告一个段落了
虽然这段日子有快乐也有不快乐,但这些日子也是我人生中不会忘记的一段时间
很感谢这些日子的陪伴,希望大家接下来都能快快乐乐的:)


若对於任何一篇文章有疑问的,也很欢迎大家留言告诉我,
感谢大家的观看!我们有缘就下次铁人赛见罗!


<<:  DAY 28『 使用相机拍照 』 ImagePicker - Part2

>>:  浅谈网路爬虫

课堂笔记 - 深度学习 Deep Learning (20)

Network Architectures 前面都在介绍单一神经元的算法,复习一下。 一个神经元的输...

Day 11:94. Binary Tree Inorder Traversal

今日题目 题目连结:94. Binary Tree Inorder Traversal 题目主题:S...

Day 30 - SBOM 工具 - syft

Syft 可以用来产生容器 (container image) 与档案系统 (file system...

javascript HTML DOM4

最後我们学习如何控制多个表单的开合 ...

[Day19] - Django-REST-Framework Viewsets 介绍

在第一个 API 中我们编写的 View,不知道大家有没有觉得非常简洁呢,好像没有写什麽代码,但是就...