iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
自我挑戰組

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

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

已經確定可以正常傳值了,只是時間的值好像怪怪的?
明天來了解一下是什麼狀況,順便將這些值新增在鬧鐘上吧!


上一篇
Swift純Code之旅 Day28. 「新增鬧鐘功能(1) - Struct使用、取得UIDatePicker值」
下一篇
Swift純Code之旅 Day30. 「新增鬧鐘功能(最終章) - 分手快樂」
系列文
30天Swift純Code之旅 - 鬧鐘篇30

尚未有邦友留言

立即登入留言