隨著課程的安排逐步加入各種技術元素,這次要演練兩個頁面轉場機制,以無聊的 BMI 計算為主題,還有講解更多 Optional 的用法。首先載入骨架專案:https://github.com/appbrewery/BMI-Calculator-iOS13 打開主畫面後兩個 View 映入眼簾,怎麼讓 App 控制權在多頁面間切換是本練習的重點。
程式流程為輸入身高體重後輸出 BMI,身高體重採用 Slider 元件可以滑動設定,計算公式很簡單就是體重 (kg) / 身高 (m) 的平方,輸出有玩點小花樣,若高過一定的數值顯示紅色並顯示建議文字,相對的一般或太低則顯示對應的顏色和不同的建議文字。首先遵守 MVC 設計模式,將 BMI 相關的欄位和計算邏輯抽出為 Model,建立兩個 struct:
其中注意到 swift 語言對於可能的 nil 值處理非常嚴謹,可能為 nil 的變數或型別後面要加 ?,型別變成 optionl(String),optional(Int) 等,不同於單純的 String or Int,要將 optional 轉型成確定的型別,設計師必須在流程上確認有值的前提下,加驚嘆號轉型,若 nil 值強加驚嘆號程式會發生錯誤,這就是設計師要負的責任。當 nil 發生時該填入什麼預設值,最方便的寫法就是雙問號運算子,免去冗長的 if-else。
兩個畫面分別對應到各自的 controller,第一個畫面的 controller 如下,slider 滑動和按鈕觸發程序的做法已經很純熟,只有「過場」到第二個畫面需要注意如下:
執行 controller 本身的 performSegue() 方法,指定 identifier,同時 override 父類別的 prepare 方法,依據 identifier 轉移給對應的 viewController,並把參數值傳進去,如這裡的 bmiValue,advice,color,轉移對象的 viewController 必須有這三個屬性,以此為依據在 viewDidLoad() 中改變呈現方式;並在 recalculate 按鍵觸發時執行 dismiss() 將控制權交還給上個畫面:
編譯完成執行囉:
https://www.youtube.com/shorts/pLSeGjkhZWY?feature=share
By Newman Chen 2022/7/13