你丟我接,不同頁面傳值方法-Delegate

Hi,

這次要跟大家介紹的是delegation委派這個方法,不要被名稱嚇到了,其實這就只是一個design pattern,可以用於非同步抓取資料的時候,讓資料回來的時候,再透過delegate把資料傳送給真正需要的人。

那其實網路上說法很多種,但我自己覺得就找到一個聽得懂的故事,來了解這個用法,重要的是要知道怎麼用啊!!

這次的案例一樣是兩個頁面傳值,跟上次透過segue的方式一樣,不同的是這次我們多定義了一個protocol叫做FetchTextDelegate

只有很單純的定義一個方法,叫做fetchText, 然後把傳入一個字串給他。

整個故事你可以想成,當我去抓完資料之後,我還要去做一些事情,但是我不想自己做,我要委派給別人去做,然後我定義了這個protocol, 必須有遵從我這個protocol的人,才可以幫我做接下來的事情。

然後~~故事開始了

我在第一個畫面當中產生了一個變數delegate, 他的型別就是FetchTextDelegate, 因為可能有委派人,也可能沒有,所以是optional

另外我透過StoryBoard, 找到一個名字叫做SecondVC的ViewController,並且把它生出來,預設生出來的型別會是ViewController, 但是我們知道名字叫做SecondVC的View Controller其實真正的class是SecondViewController,所以我直接把它做轉型的動作。

然後我在按鈕按下去的時候呢,我先把剛剛宣告的secondVC 推到畫面上,然後把自己的delegate,設定給secondVC, 因為我抓完資料之後,我希望請secondVC幫我做事情。接著我就可以去呼叫self.delegate.fetchText的這個方法,透過這個方法把textfield的內容傳到secondVC。


接著我們到secondVC當中來看一下

還記得我剛剛說必須要遵從FetchTextDelegate的人,才可以幫我做事情嗎?

這時候因為SecondViewController僅是一般的UIViewController,所以這個時候程式是會出錯的。

我們必須先讓SecondViewController遵從FetchTextDelegate,一但我們遵從這個delegate, Xcode就會要求我們實作一個方法叫做fetchText,當我們我們撰寫這個方法的時候,會傳進一個text變數,這個text,就是我們在FirstViewController,傳進去的值,我們只要把text顯示到displayTextView就完成整個delegation了。

所以整個Delegation可以看做有三個人

  1. 叫別人去抓資料的人
  2. 真正去抓資料的人
  3. 資料回來之後,要給的那個人

而在這個案例中,1/2都是我們的FirstViewController, 因為我只是簡單的輸入字串,真正在使用的時候可能是去網路上或是資料庫抓取資料,非同步的狀況時。可能會有A叫B去抓資料,資料回來之後再給另外一個人。

而3就是SecondViewController, 因為我們抓完資料回來之後,要把資料給他把事情做完,至於做什麼事情,只有他自己知道。

好的,以上範例完成的程式碼在下列github當中,如果有任何問題歡迎指正或是留言與我討論,謝謝大家~

彼得潘的 Swift iOS App 開發教室

學習 Swift iOS App 開發的學生作品集

)

Nick’s journey on iOS.

Written by

iOS developer at 91app. If you like my articles, please clap and follow me on Medium. Hope all happiness be with you. Never stay still, never plateau!

彼得潘的 Swift iOS App 開發教室

學習 Swift iOS App 開發的學生作品集