iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
自我挑戰組

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

Swift純Code之旅 Day15. 「頁面傳值?代理? Delegate?Protocol?(1)」

前言

我們已經完成了標籤這個頁面了,可以看一下再IPhone內這個頁面的功能:

會將標籤頁面輸入的值傳回上個頁面,那這邊就會用到Protocol!

實作

網路上應該有很多Protocol的介紹了,分享一下我所理解的Protocol:

「請別的ViewController執行這個Protocol內的Function」

是不是有點太簡單了XD,但我所理解的Protocol其實就這麼的單純,
接下來用實作來理解一下Protocol吧!

首先先在AlarmLabelViewController(標籤頁面)中,新增一個Protocol,
該Protocol內有一個夾帶String參數的Function。

protocol UpdateAlarmLabelDelegate: AnyObject {
    func updateAlarmLabel(alarmLabelText: String)
}

Protocol必須要寫在ViewController的Class外面

接著再新增一個變數,存放該Protocol

weak var updateAlarmLabelDelegate: UpdateAlarmLabelDelegate?

可以看到Protocol後面有加Anyobject,Delegate變數前面有加weak,這邊可以去看看「ARC」

到這邊我們就建立完成Protocol了,接下來看看如何使用:
我們需要的功能是:「離開這個頁面時,將輸入框內的文字傳送到前一頁,並且顯示」
因此我們可以在 ViewWillDisappear()內,實作這個Protocol內的updateAlarmLabel()

override func viewWillDisappear(_ animated: Bool) {
        
        if let text = alarmLabelTextField.text {
            
            if text == "" { // 若輸入框內為空白,回傳「鬧鐘」
                updateAlarmLabelDelegate?.updateAlarmLabel(alarmLabelText: "鬧鐘")
            }else { // 若輸入框內不為空白,回傳「輸入框內的文字」
                updateAlarmLabelDelegate?.updateAlarmLabel(alarmLabelText: text)
            }
        }
    }

那到這邊就設定完這個Protocol要做的事情了,明天再來完成誰要實作這個Protocol的部分!


上一篇
Swift純Code之旅 Day14. 「TableView(5) - 點擊TableViewCell」
下一篇
Swift純Code之旅 Day16. 「頁面傳值?代理? Delegate?Protocol?(2)」
系列文
30天Swift純Code之旅 - 鬧鐘篇30

尚未有邦友留言

立即登入留言