[Day 18] 里程定位與地圖顯示(四)- Picker 滑動時會亂跳?開立 bug 單吧!
在我們昨天的進度中,我們建立了一個選擇道路的 Picker。但正當我興高采烈地測試時,發現了一個奇怪的 bug:當我快速滑動 Picker 的選項列表,手指一放開,列表的慣性滑動動畫到一半,它就自己重新整理了。 我的第一個反應是:「蝦米,這啥鬼?」我反覆檢查程式碼,Picker 的 selection 明明只綁定了 @State private var selectedRoad,在滑動過程中,這個變數的值也沒改變,為什麼它會自己跳回去?難道是 SwiftUI 的 bug? Troubleshooting SwiftUI View 的計算本質 經過一番研究(問 AI…XD),我發現問題的根源要回到 SwiftUI 對於 View 的本質: 在 SwiftUI 裡,View 不是靜態的畫面,而是由「狀態 (State)」推導出來的結果。 我們透過以下簡單的例子再一次複習 SwiftUI 畫面更新的概念: struct CounterView: View { @State private var count = 0 var body: some View { VStack { Text("Count: \(count)") Button("加一") { count += 1 } } } } 這裡的 body 是一個 compute property,它的職責是根據目前的狀態 count,回傳一個描述 UI 的藍圖。輸入是 count 的值,輸出是一個新的 View,只要 count 改變,整個 body就會重新被計算,畫面就會跟著更新。這表示,只要一個 View 所依賴的任何一個「狀態來源」(@State, @StateObject 等) 發生改變,SwiftUI 就會重新執行這個 View 的 body 屬性,計算出一個新的 View 結構。 ...