Ep.24[ wen’s iOS ] — 計算生命靈數 IBSegueAction

利用生命靈數這個作業以了解資料在不同頁面間的傳遞,根據不同需求以利用不同的方式傳遞資料。

以下是資料傳遞的各種方法:

  • 透過 Prepare
  • 透過 IBSegueAction
  • unwind segue
  • notification
  • delegate
  • closure
  • KVO
  • global variable

@IBSegueAction 就像一個魔法信使,當你要切換到下一個場景時,它會幫你把重要的信息傳遞給下一個場景。這個信息可以是你的分數、你的名字,或者其他你想告訴下一個場景的東西。

當 segue 綁定 IBSegueAction 定義的 function 時,App 在透過 segue 切換頁面時會呼叫 IBSegueAction 定義的 function,是一種透過屬性儲存在不同頁面間傳遞資料的方式。

App 實作

storyboard 建立

由於要練習不同頁面間的資料傳遞,因此第一頁創建資料夾 Birthday View Controller 存放跟這個頁面相關的程式碼,第二頁創見資料夾 Result View Controller 存放跟結果相關的程式碼。

最重要的從原本按 button 產生的 segue 線中再拉到右邊產生 IBSegueAction 取名 showResult ,用意就是在按下 button 元件換頁的時候跑到這個 showResult 的 function , 換頁的邏輯是產生 Controller ,coder 則是 stroyboard 中存放的元件 (這邊是存放 web view 以顯示網頁)。

@IBSegueAction func showResult(_ coder: NSCoder) -> ResultViewController? {
// 通過提供的 NSCoder 實例化 ResultViewController,先儲存產生的 controller
let controller = ResultViewController(coder: coder)

// 設置 ResultViewController 的 birthday 屬性為 datePicker 的日期 date
controller?.birthday = datePicker.date

// 回存到 ResultViewController
return controller
}

如此一來下一頁就有了第一頁 datePicker 選到的 date 的日期。

注意:這邊不能偷懶直接把下一頁要顯示的內容例如 label.text 也寫在 IBSegueAction 中,因為此時 label 的內容為 nil,要在 viewDidload 才會生成這些內容。

if let url = URL(string: "https://www.ifreesite.com/numerology/a\(number).htm") {
// 創建一個 URL 請求,使用剛剛創建的 URL
let request = URLRequest(url: url)

// 使用 WebKit 中的 WebView 加載 URL 請求,顯示網頁內容
webView.load(request)
}

要顯示網頁,必須先 send URL 的請求,接著讓 server 端 request 我們的請求,最後才能 load 我們請求的網址以顯示內容。

func calculateLifeNumber(date: Date) -> Int {
// 創建一個 DateFormatter 對象,用於將日期轉換為指定格式的字符串
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyyMd" // 設置日期格式為年份+月份+日期(例如:20230903)

// 使用日期格式化器將傳入的日期轉換為字符串
var numberString = dateFormatter.string(from: date)

var sum = 0 // 初始化計算總和的變數

// 進入一個循環,直到總和小於或等於9為止
repeat {
sum = 0 // 初始化總和為0

// 遍歷日期字符串中的每個字符
for character in numberString {
// 將字符轉換為整數,並將其添加到總和中
let number = Int(String(character))!
sum = sum + number

// 更新日期字符串以包含新的總和(用於下一輪迭代)
numberString = "\(sum)"

// 在每次計算總和後打印總和(用於調試)
print(sum)
}
} while sum > 9 // 檢查總和是否大於9,如果是,則繼續循環

// 返回計算出的生命數字
return sum
}

先用 DateFormatter 把日期格式化成我們要的樣子,但是日期有很多格式,這邊可以參考各種格式,我們要的就是 20230910 這樣的格式。

創一個變數 numberString 傳入我們選取的日期並轉成字串,用 repeat while 的寫法讓 for loop 中的每個數字一個一個相加,加完 > 9 就繼續加,直到< 9 結束 while loop。

相加過程以便了解 1+9 =10, 10+9 =19 …

--

--