Swift纯Code之旅 Day29. 「新增闹钟功能(2) - 如何使用Delegate传值」

前言

昨天我们已经将资料打包完成了,离完成闹钟功能只差一点点了,
只要把资料回传到首页,就可以实现新增闹钟的功能了!
这边将会使用Delegate的方式做资料回传,马上来看看如何传值吧!

实作

之前有稍微用我的方式介绍过Delegate的概念,有兴趣的可以参考「Day15」/images/emoticon/emoticon07.gif
那马上来实作吧!


  1. 先建立一个Protocol,命名为UpdateAlarmListDelegate
    为这个Protocol新增一个Function,名称为「updateAlarmList」
    该Function含有一个参数:alarmdata,型态为「AddAlarmInfo」(昨天建立的Struct)
protocol UpdateAlarmListDelegate: AnyObject{

    // 该Protocol含有一个Function,带有一个参数:「alarmData」,其型态为「AddAlarmInfo」
    func updateAlarmList(alarmData: AddAlarmInfo)
}
  1. 建立一个型态为「UpdateAlarmListDelegate」的变数「updateAlarmListDelegate」
    让我们可以使用这个Protocol。
weak var updateAlarmListDelegate: UpdateAlarmListDelegate?
  1. 在按下储存按钮的function内,使用变数「updateAlarmListDelegate」内的updateupdateAlarmList
    之後关闭该页面。
@objc func saveAlarm() {
        
        // 实体化我们创建的Struct「AddAlarmInfo」,并装在saveAlarmData内
        //「AddAlarmInfo」的第一个参数,就给他DatePicker上面的时间
        //「AddAlarmInfo」的第二个参数,就给他标签的内容
        let saveAlarmData = AddAlarmInfo(time: self.datePicker.date,
                                         annotation: self.addAlarmDetails[1])
        
        // 使用updateAlarmListDelegate内的「updateAlarmList」回传「saveAlarmData」
        updateAlarmListDelegate?.updateAlarmList(alarmData: saveAlarmData)
        
        // 将新增闹钟页面给关闭
        self.dismiss(animated: true, completion: nil)
    }
  1. 到「AlarmViewController」内新增以下Code,
    告知「UpdateAlarmListDelegate」由这个Viewcontroller实作
@objc func addAlarm() {
        let vc = AddAlarmViewController()
        // 指定「AddAlarmViewController」的Delegate由该Controller实作
        vc.updateAlarmListDelegate = self
        let nv = UINavigationController(rootViewController: vc)
        present(nv, animated: true, completion: nil)
    }
  1. 此时会跳出以下Error,该Error的意思是:
    你告知「UpdateAlarmListDelegate」将由这个Viewcontroller实作,
    但却没实作里面的Function:「updateAlarmList」
    https://ithelp.ithome.com.tw/upload/images/20211009/20108999ipHoNcbG94.png

  2. 因此,可以在Class外面,加入以下Code来实作「updateAlarmList」

extension AlarmViewController: UpdateAlarmListDelegate {
    
    func updateAlarmList(alarmData: AddAlarmInfo) {
        
        // print看看回传过来的值是什麽
        print(alarmData)
    }
}
  1. 来试试看Print出来的会是什麽吧!首先先做以下设定
    https://ithelp.ithome.com.tw/upload/images/20211009/201089994Me8Ewvklr.png

  2. 按下储存看看会Print出什麽吧!
    https://ithelp.ithome.com.tw/upload/images/20211009/201089993oOmg068vq.png

/images/emoticon/emoticon02.gif/images/emoticon/emoticon02.gif/images/emoticon/emoticon02.gif/images/emoticon/emoticon02.gif/images/emoticon/emoticon02.gif

已经确定可以正常传值了,只是时间的值好像怪怪的?
明天来了解一下是什麽状况,顺便将这些值新增在闹钟上吧!


<<:  Re: 新手让网页 act 起来: Day24 - React Hooks 之 useMemo

>>:  Day-17 同步、非同步与事件循环

【没钱买ps,PyQt自己写】Day 19 - 使用 QProgressBar,制作进度条的功能

看完这篇文章你会得到的成果图 前言 这篇我们要来学一个新的东西 QProgressBar! QPro...

Day12 数据图表化 - 如何建立 Visualize

在今天的文章中,我们准备开始建立视觉化(Visualize)元件,来展现一下kibana强大的图形化...

Day18-内边距、外边距(CSS)

今天画个丑丑的图片来介绍内边距(padding) 边框(border) 外边距(margin) 这张...

Day29-"练习-4"

今天也是练习CPE的题目 世界闻名的黑社会老大A先生要搬到纽约来了。在那里他有一个大家族,并且他们都...

DAY26:Google Map之简介及实作

今天要来说到在APP中加入Google map,以下概略的介绍一些建置与功能用法,首先,我们要来新增...