你丟我接,不同頁面傳值方法-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都是我們的FirstViewController, 因為我只是簡單的輸入字串,真正在使用的時候可能是去網路上或是資料庫抓取資料,非同步的狀況時。可能會有A叫B去抓資料,資料回來之後再給另外一個人。
而3就是SecondViewController, 因為我們抓完資料回來之後,要把資料給他把事情做完,至於做什麼事情,只有他自己知道。
好的,以上範例完成的程式碼在下列github當中,如果有任何問題歡迎指正或是留言與我討論,謝謝大家~

