在開的過程中可能會遇到某些頁面需要共用資料的狀況,但是使用全域變數又會使得生命週期太長,而且如果資料有問題也比較難除錯,所以今天要來介紹兩種常見的頁面間傳值的方法
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 譯作單例模式,簡單概括就是創建一個類並且只有一個實例,讓需要的人去取用
輸入以下程式碼來建立單例
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")
}
成功執行的解果會長這樣
會多兩個 Passing 是因為 Segue 在 unwind 的過程中會經過前兩個頁面,所以 viewWillAppear 會動作