iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 5
2
Software Development

30天Swift入門學習系列 第 5

Delegate and Datasource in class

在之前的實作中,像是 UITableView 或是 UICollectionView ,通常會看到以下片段:

tableView.delegate = self
tableView.datasource = self

上述的 delegate 及 datasource 的目的是什麼呢?
其實兩者的目的是一樣的,都為了讓資料可以在物件(struct 或 class)間傳遞。只不過一個是用來控制 UI event(delegate) 像是選擇 table cell 後該做什麼動作,一個是用來顯示 table cell 內的資料(datasource)。

在這邊舉一個例子來說明 delegate 的使用方法:
試想一個狀況,一個小嬰兒肚子餓了如何吃飯?
在這裡例子中會需要兩個物件,母親(mother)跟嬰兒(baby)

var mother = Mom()
var baby = Baby()

首先母親這個物件為了煮飯因此需要具備煮飯的功能(繼承 CookDelegate 並實作 prepardFood()):

public protocol CookDelegate {
  optional public func prepardFood() 
}

class Mom: CookDelegate { 
  func prepardFood() { print("Making food~") } 
}

接下來因為嬰兒不會煮飯需要尋找會煮飯的人(也就是母親):

class Baby { 
  var delegate: CookDelegate? // delegate = someone with special skills
}

最後嬰兒透過母親的協助來讓自己吃飽

baby.delegate = mother // get assist from mom
baby.delegate?needFood() // print Making food~

看過上述的例子之後,回到 Swift 開發實例:

class exampleVC: UIViewController, UITableViewDelegate {

  override func viewDidLoad() {
    super.viewDidLoad()
    let tableView = UITableView()
    tableView.delegate = self
   }
}

在這實例中包含兩個物件: exampleVC 及 tableView。其中 Delegator 是 tableView,
delegate 是 self (即 exampleVC )。當 tableView 想要實作 didSelectRowAt() 時,因 tableview 這物件本身 delegate 其 type 是 UITableViewDelegate,而 self 又繼承 UITableViewDelegate protocol。因此則可以透過 delegate 來要求 self 來幫忙完成 didSelectRowAt() 的實作。

Reference
Delegate explain in Apple document


上一篇
iOS App實作(4) Image List (UITableView)
下一篇
iOS App實作(5) UITabBarController + UINavigationController
系列文
30天Swift入門學習30

尚未有邦友留言

立即登入留言