我有以下簡單的 SwiftUI 視圖,其中包含一個組件,其中包含一個帶有復選框的營銷偏好選項串列和一個用于更新偏好的按鈕:
@StateObject var marketingPreferencesViewModel: MarketingPreferencesViewModel
var body: some View {
VStack {
MarketingPreferencesView(viewModel: .init())
Button {
marketingPreferencesViewModel.marketingUpdateRequested()
} label: {
Text("Update prefs")
}
}
}
MarketingPreferencesView如下:
struct MarketingPreferencesView: View {
@ObservedObject var viewModel: MarketingPreferencesViewModel
var body: some View {
VStack(alignment: .leading) {
marketingPreference(type: .email)
marketingPreference(type: .directMail)
marketingPreference(type: .notification)
marketingPreference(type: .sms)
marketingPreference(type: .telephone)
}
}
func marketingPreference(type: MarketingOptions) -> some View {
HStack {
if viewModel.preferencesAreLoading {
ProgressView()
} else {
Button {
switch type {
case .email:
viewModel.emailMarketingEnabled.toggle()
case .notification:
viewModel.notificationMarketingEnabled.toggle()
case .sms:
viewModel.smsMarketingEnabled.toggle()
case .telephone:
viewModel.telephoneMarketingEnabled.toggle()
case .directMail:
viewModel.directMailMarketingEnabled.toggle()
}
} label: {
switch type {
case .email:
viewModel.emailMarketingEnabled ? Image.General.Checkbox.checked : Image.General.Checkbox.unChecked
// ... remaining switch cases follow same pattern
}
}
}
Text(type.title())
}
.padding(.bottom, Constants.bottomPadding)
}
}
和 MarketingPreferencesViewModel:
class MarketingPreferencesViewModel: ObservableObject {
@Published var emailMarketingEnabled = false {
didSet {
print(emailMarketingEnabled)
}
}
@Published var directMailMarketingEnabled = false
@Published var notificationMarketingEnabled = false
@Published var smsMarketingEnabled = false
@Published var telephoneMarketingEnabled = false
private func updateMarketingPreferences() {
// For now, just printing emailMarketingEnabled value for debugging
print(emailMarketingEnabled)
}
func marketingUpdateRequested() {
self.updateMarketingPreferences()
}
}
}
所以用戶點擊營銷偏好按鈕,這會切換視圖模型中的相應值。
但是,由于某種原因,當我點擊 marketingUpdateRequested() 方法時,如果我檢查 emailMarketingEnabled 的值,即使我已經切換它也總是錯誤的。
重現步驟:
- 點擊 emailMarketingEnabled 按鈕
- 'true' 列印在控制臺中
- 點擊“更新首選項”按鈕
- 列印“假”
我已將 didSet 放在 emailMarketingEnabled 屬性上,以查看它是否在其他地方發生了變化,但事實并非如此。那么,為什么一旦我設定為 true,當我點擊按鈕時這就是 false?
uj5u.com熱心網友回復:
您需要實體化MarketingPreferencesViewModel,然后將其傳遞給您的
MarketingPreferencesView,如以下示例代碼所示:
// -- here
@StateObject var marketingPreferencesViewModel = MarketingPreferencesViewModel()
var body: some View {
VStack {
MarketingPreferencesView(viewModel: marketingPreferencesViewModel) // <-- here
Button {
marketingPreferencesViewModel.marketingUpdateRequested()
} label: {
Text("Update prefs")
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/451001.html
