iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
0

Passing Data

在開的過程中可能會遇到某些頁面需要共用資料的狀況,但是使用全域變數又會使得生命週期太長,而且如果資料有問題也比較難除錯,所以今天要來介紹兩種常見的頁面間傳值的方法

Prepare For Segue

Prepare for segue 可謂最常見也最簡單的傳值方法,就是透過 UIStoryboardSegue 的路徑,將資料指定給目的地的變數

我們以 Day21 做的範例為例,首先在每個 ViewController 都宣告用來接收及傳送的兩個變數。

var getData: Any?
var dataToPass: Any?

// Any -> 接收及傳入的資料可以是任意型態

再來,當我們按下 Button 時,列印我們接收到的資料以及寫入我們將傳送的資料

print(getData ?? "nil")
dataToPass = "Hello World"

最後,寫下傳送的 Function

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// 當要執行的 UIStoryboardSegue 的目的地為 YellowViewController 時
    let destination = segue.destination as! YellowViewController
// 將此頁的 dataToPass 指定給目的地的 getData
    destination.getData = dataToPass
}

如果是同一個母畫面去配很多個子畫面的話,就可以在 prepare 的 Function 內加入 Identifier 的判斷

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    switch segue.identifier {
    case "identifier1":
        let destination = segue.destination as! SubViewControllerOne
        destination.getData = dataToPass
    case "identifier2":
        let destination = segue.destination as! SubViewControllerTwo
        destination.getData = dataToPass
    case "identifier3":
        let destination = segue.destination as! SubViewControllerThree
        destination.getData = dataToPass
    default:
        return
    }
}

Singleton

Singleton 譯作單例模式,簡單概括就是創建一個類並且只有一個實例,讓需要的人去取用

輸入以下程式碼來建立單例

class DataToPass {
    static let share = DataToPass()
    var data = ""
    
    private init() {}
}

如此一來,當我需要時就能輸入以下程式碼來取用該筆資料

let getData = DataToPass.share.data

以下是範例

// ViewController
    override func viewWillAppear(_ animated: Bool) {
    //第一次載入時是沒有資料的,但第二次載入時會有最後一頁的資料
        if DataToPass.share.data == "" || DataToPass.share.data == "Passing" {
            DataToPass.share.data = "My"
        }
        
        getData = DataToPass.share.data
        print(getData ?? "nil")
    }
    
// YellowViewController
    override func viewWillAppear(_ animated: Bool) {
        if DataToPass.share.data == "My" {
            DataToPass.share.data = "Data"
        }
        
        getData = DataToPass.share.data
        print(getData ?? "nil")
    }

// GreenViewController
    override func viewWillAppear(_ animated: Bool) {
        if DataToPass.share.data == "Data" {
            DataToPass.share.data = "Is"
        }
        
        getData = DataToPass.share.data
        print(getData ?? "nil")
    }

// BlueViewController
    override func viewWillAppear(_ animated: Bool) {
        if DataToPass.share.data == "" || DataToPass.share.data == "Passing" {
            DataToPass.share.data = "My"
        }
        
        getData = DataToPass.share.data
        print(getData ?? "nil")
    }

成功執行的解果會長這樣
https://ithelp.ithome.com.tw/upload/images/20200930/20129677hZpRqSME2U.png
會多兩個 Passing 是因為 Segue 在 unwind 的過程中會經過前兩個頁面,所以 viewWillAppear 會動作


上一篇
Day21 UIStoryboardSegue
下一篇
Day23 XIB
系列文
IOS Beginner's 30days 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言