iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
自我挑戰組

一個令我自豪的App完成之路系列 第 8

Delegate的使用法 Day8

完蛋了今天,今天比昨天打完更嚴重,睡到晚上3點,被身體熱醒,起床量個溫度37.3好像又不是很高,但熱到睡不著,只好走出房間休息的一時半刻,最後終於在四點多睡著,結果今天一天,頭都超痛,手臂也會痛,眼壓還特別高,這算是變相在懲罰我吧!


今天算是來複習Delegate的使用,因為之後的頁面都會使用到Delegate這個概念

什麼是Delegate?

Delegate 比較像是一個Design Pattern,算是一種程式設計的手法

Swift這個程式語言具有POP的性質,那什麼事POP?

POP是Protocol Oriented Programming的意思,可以使用Protocol來完成很多交付任務

先來看一下UML

https://i.imgur.com/UhbP43I.png

這張圖顯示了彼此之間的關係

也知道我們在設計Delegate會有三個要素:

  • Delegating Object(委託對象)
  • Protocol(協定)
  • Delegae(代理對象)

由這三個名詞解釋,可以知道是由Delegate作為最終的執行者

Protocol作為兩個之中的連結

這邊是Code碼示範,會引用AppCoda的資料,加上我的理解,詳細網站會附在下面

要做到的事情是使用Delegate傳遞資料

第二視圖輸入的資料在第一視圖內呈現

https://i.imgur.com/Ef8YYIC.png

https://i.imgur.com/d2EKZ89.png

// 第一視圖
class FirstViewController: UIViewController {
      @IBOutlet weak var labelPlatformDetails: UILabel!
      @IBOutlet weak var labelDeveloperLanguage: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()
}

//MARK: - Navigation
@IBAction func actionAddDetail(_ sender: UIButton) {
	 // 實例化一個第二視圖ViewController
   guard  let secondView = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController else {
       fatalError("View Controller not found")}
// 將第二視圖內的Delegate由這第一視圖來執行
secondView.delegate = self //Protocol conformation here
// 切換ViewController
navigationController?.pushViewController(secondView, animated: true)}
}
//MARK: - Protocol Delegate Methods
extension FirstViewController: DeveloperEntryDelegate {
		// 將第二視圖所回傳的資料text 放入第一視圖的text內
		func textDeveloperPlatform(_ text: String){
      labelPlatformDetails.text = "Platform: \(text)" }
		// 將第二視圖所回傳的資料text 放入第一視圖的text內
		func textDeveloperLanguage(_ text: String) {
	    labelDeveloperLanguage.text = "Language: \(text)" }
}
// 第二視圖

// Delegate Protocol
protocol DeveloperEntryDelegate: AnyObject {
func textDeveloperPlatform(_ text: String)
func textDeveloperLanguage(_ text: String) }

class SecondViewController: UIViewController {
			// 產生一個delegate變數,用途負責傳送資料
			// 使用weak 所以上面的Protocol: AnyObject
      weak var delegate: DeveloperEntryDelegate?
      @IBOutlet weak var textPlateform: UITextField!
      @IBOutlet weak var textLanguage: UITextField!
override func viewDidLoad() {
         super.viewDidLoad() }
  //MARK: - Action Pass back view Details
  @IBAction func actionDone(_ sender: UIButton) {
    self.navigationController?.popViewController(animated: true)
		// 使用Delegate傳送這個剛剛輸入文字的函數
    self.delegate?.textDeveloperPlatform(textPlateform.text ?? "")
    self.delegate?.textDeveloperLanguage(textLanguage.text ?? "")
   }
}

參考網站:

了解 Delegation Pattern 讓你更有效率地實作類別之間的溝通!

iOS 開發者指南:透過 Swift 4 學習 Delegates 與 Delegation

Delegation Pattern in Swift

Class Diagram to convey the Delegate Pattern


上一篇
AppDelegate的初介紹 Day7
下一篇
能夠滑起來的UICollectionView Day9
系列文
一個令我自豪的App完成之路32

尚未有邦友留言

立即登入留言