如何解决SwiftUI Stepper不会影响基础绑定
晚上好
在我当前的项目中,我正在如下所示的ForEach-Loop中创建
: ForEach(self.viewModel.dailyNutritionReports[self.selectedReportIndex].dailyNutritionReportElementMO,id: \.self) { element in
ReportElementItem(
viewModel: self.viewModel,element: element,selectedReportIndex: self.selectedReportIndex
)
然后在视图本身中有一个步进器:
Stepper(
"",value: self.getStepperBinding(),in: 0...9,step: 0.25
)
我使用自定义绑定,因为我需要将更改保存在CoreData中:
private func getStepperBinding() -> Binding<Double> {
Binding<Double>(
get: { self.element.amount },set: {
self.element.amount = $0
self.viewModel.updateDailyNutritionReportElement(element: element)
}
)
}
然后在视图中尝试显示步进值(element.amount)
,如下所示:
Text("\(element.amount)")
总计视图如下:
struct ReportElementItem: View {
@ObservedObject var viewModel: HomeViewVielModel
@State var element: DailyNutritionReportElement
@State private var isChecked: Bool = false
var selectedReportIndex: Int
@Environment(\.colorScheme) var colorScheme: ColorScheme
var body: some View {
let background = colorScheme == .dark ? Color.secondarySystemBackground : Color.systemBackground
return ZStack {
background
.overlay(RoundedRectangle(cornerRadius: 15).stroke(Color.quaternaryLabel))
HStack {
ZStack {
Circle().frame(width: 100,height: 100,alignment: .center)
.foregroundColor(colorScheme == .dark ? Color.quaternarySystemFillSystemFill : Color.systemFill)
VStack(alignment: .center) {
Image(element.dailyNutritionReportElementTypeMO.dailyNutritionReportElementTypeIconMO.imageName)
.resizable()
.frame(width: 60,height: 60,alignment: .center)
}
.padding()
}
Spacer()
if element.dailyNutritionReportElementTypeMO.dailyNutritionReportElementUnitMO.abbreviation != "Y/N" {
VStack(spacing: 10) {
Text(element.dailyNutritionReportElementTypeMO.typeDescription)
.multilineTextAlignment(.leading)
.foregroundColor(Color.label)
.font(.system(size: 20))
HStack(alignment: .center) {
Text("\(String(format: "%.2f",self.element.amount))")
Text("von")
Text("\(String(format: "%.2f",element.dailyNutritionReportElementTypeMO.dailyTarget))")
//Text(element.dailyNutritionReportElementTypeMO.dailyNutritionReportElementUnitMO.name)
}
Stepper(
"",step: 0.25
)
.labelsHidden()
}
Spacer()
}
}
}
private func getStepperBinding() -> Binding<Double> {
Binding<Double>(
get: { self.element.amount },set: {
self.element.amount = $0
print(element.amount)
self.viewModel.updateDailyNutritionReportElement(element: element)
}
)
}
}
}
但是,按任何步进按钮,都不会对我的文本和底层CoreData值产生任何影响。在我的绑定的set
部分上放置一个断点告诉我,从未调用此部分。
我已经尝试过将元素的索引传递到视图而不是元素,并使用带有onIncrement
和onDecrement
方法的Stepper,但是没有任何方法可以解决问题。
有人可以告诉我我的错误是什么吗?
谢谢你们!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。