我有一個使用 MVVM 結構的 SwiftUI 專案,但是我現在在 View 中有很多變數,對嗎?我該如何改進呢?
例如,這是我的添加記錄視圖
@State private var money: String = ""
@State private var desc: String = ""
@FocusState var isDescFieldFocused: Bool
@State private var showDatePicker: Bool = false
@State private var showingAlert: Bool = false
@State private var showConstantlyAlert: Bool = false
@State private var showKeyPad: Bool = false
@State private var showCatesPanel: Bool = false
@State private var selectedCate: String = ""
我應該把所有這些都放在視圖模型中嗎?
uj5u.com熱心網友回復:
Apple在 4:18 的 SwiftUI WWDC 2020 中的 Data Essentials 中解決了這個問題
EditorConfig 可以維護其屬性的不變數并獨立進行測驗。而且因為 EditorConfig 是一種值型別,所以對 EditorConfig 屬性的任何更改(例如其進度)都會作為對 EditorConfig 本身的更改可見。4:18
所以在你的情況下,它看起來像:
struct MyConfig {
var money: String = ""
var desc: String = ""
var showDatePicker: Bool = false
var showingAlert: Bool = false
var showConstantlyAlert: Bool = false
var showKeyPad: Bool = false
var showCatesPanel: Bool = false
var selectedCate: String = ""
mutating func otherLogic() {}
}
struct MyView {
@State var config = MyConfig()
@FocusState var isDescFieldFocused: Bool
讓您知道,MVVM(即使用物件獲取視圖資料)不適合 SwiftUI,因為 View 結構和屬性包裝器等效于視圖模型物件,但速度更快且不易出錯。如果您使用實際物件而不是學習 SwiftUI 的功能,您將遇到問題。
我們在 SwiftUI 中使用 an 的時間ObservableObject是用于模型資料,即在@Published屬性中存盤模型結構陣列并負責加載/保存/同步等模型資料等的環境物件/單例。這在同一個視頻中有所介紹稍后,從大約 9 分 30 秒開始。
對于模型資料的寫訪問,我們使用@Binding.
我們曾經也@StateObject用于處理網路或委托,但現在我們有了task修飾符,它做同樣的事情但更好。
uj5u.com熱心網友回復:
就像您說的那樣,您可以為該視圖創建一個視圖模型,它可以是一個@StateObject或@ObservedObject(取決于您是要在視圖中創建視圖模型還是從外部注入它)。
如果它們需要任何邏輯,我傾向于為我的視圖創建視圖模型,而不僅僅是顯示從父視圖傳遞下來的資訊。
因此,您可以這樣做:
final class YourNameViewModel: ObservableObject {
@Published var money = ""
// other properties
init() {
...
}
}
并在您的視圖中使用它,如下所示:
struct YourNameView: View {
@StateObject var vm = YourNameViewModel()
// or @ObservedObject var vm: YourNameViewModel (if you want to pass it down from a parent view)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/507438.html
