iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Mobile Development

IOS的打怪升級之路系列 第 29

鐵人賽第二十九天 不同的畫面傳值 下 protocol的使用

  • 分享至 

  • xImage
  •  

說明

當我們在多個不同的畫面之間有傳遞資料的需求時,除了單例 (Singleton) 之外,還有另一種常用的方式:protocol。與單例不同的是,protocol 是單向的傳遞資料方式,適合在兩個畫面之間進行資料傳遞。本文將說明如何使用 protocol,讓一個畫面將資料傳遞給另一個畫面。/images/emoticon/emoticon08.gif

實作

  1. 在需要傳值的畫面宣告 : protocol 我們首先在需要發送資料的畫面(例如 bViewController)宣告一個 protocol,並定義要傳遞的資料內容。在這裡,我們傳遞一個 String 值,命名為 SendData。當然,你也可以傳遞更多的值,甚至使用 struct 來一次傳遞多個值。
protocol bViewControllerDelegate: AnyObject { // bViewController 為當前畫面名稱
    func SendData(_ lbtext: String) // 定義傳遞的資料
}
  1. 宣告該畫面的 delegate : 接著,我們在 bViewController 中宣告一個 delegate 變數,並將它設置為弱引用 (weak) 以避免循環引用。這個 delegate 會指向接收資料的畫面
weak var delegate: bViewControllerDelegate?
  1. 在要傳值時進行傳值動作 : 當你需要傳遞資料時,只需調用 delegate 的方法,並傳遞你要傳的值。例如當按下按鈕或其他觸發條件時,將 lbabel.text 傳遞出去:
 delegate?.SendData(lbabel.text ?? "")
  1. 在接收端的畫面宣告用來存放接收到的值的變數 : 在接收端畫面(例如 aViewController)中,我們可以宣告一個變數來接收傳遞過來的值。這一步是選擇性的,依據需求而定。
var blbtext = ""

5.實作 protocol 並設定接收資料的動作 最後,我們在接收端的畫面實作這個 protocol,並將具體的資料處理邏輯放入 SendData 方法中。這裡可以是更新變數、重新整理畫面或其他操作。

extension aViewController: bViewControllerDelegate { // aViewController 為接收端,bViewController 為發送端
    func SendData(_ lbtext: String) { // 方法名稱必須與發送端一致
        blbtext = lbtext // 將資料存放到變數中
        aViewController.reloaddata() // 或執行其他需要的動作,例如重新整理資料
    }
}

結語

透過 protocol,我們可以實現單向的資料傳遞,適合用在一個畫面將資料傳遞給另一個畫面的情境中。相較於單例 (Singleton),protocol 更加靈活,適合短期、單次的資料傳遞。如果對於資料傳遞有更多的需求,可以考慮將 protocol 與其他設計模式結合使用。/images/emoticon/emoticon07.gif


上一篇
鐵人賽第二十八天 不同的畫面傳值 上 單例(Singleton)的使用
下一篇
鐵人賽第三十天 github的運用
系列文
IOS的打怪升級之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言