我正在使用工作表方法来显示一个简单的表单,然后将几个可变变量传递给它。问题是,如果在更改传入的变量后单击执行.dismiss()方法的按钮,将无法正常工作。相反,如果我直接单击该按钮,它将正常工作。 这是代码:
struct EditProductForm: View {
var listIndex : Int
var product : Product
@State var quantity: Int
@State var productName : String
@EnvironmentObject var data : Data
@Environment(\.presentationMode) var presentationModeEdit
func editProduct(){
self.data.editProduct(listIndex: self.listIndex, product: self.product, productName: self.productName, quantity: self.quantity)
}
var body: some View {
VStack{
Spacer()
VStack(spacing: 64){
Text("Edit Product")
TextField("Edit the name", text: $productName)
Picker(selection: $quantity, label: Text("Quantity")){
Text("OK").tag(Constants.Status.OK)
Text("Almost finished").tag(Constants.Status.ALMOST_NONE)
Text("Finished").tag(Constants.Status.NONE)
}.pickerStyle(SegmentedPickerStyle())
Button(action: {
self.editProduct()
self.presentationModeEdit.wrappedValue.dismiss()
}){
Text("Save")
}
}
Spacer()
}.padding(.horizontal)
}
}
我还检查了isPresented变量是否更改了值,并且当我单击按钮但工作表停留在该位置时,它是否实际上已切换。
这是我使用表格的代码:
ForEach(self.list.content, id: \.self) { item in
Button(action: {
self.show_modal_edit[self.list.content.firstIndex(of: item)!] = true
}){
ProductCell(item: item)
}.sheet(isPresented: self.$show_modal_edit[self.list.content.firstIndex(of: item)!]){
EditProductForm(
listIndex: self.listIndex,
product: item,
quantity: item.quantity,
productName: item.productName
).environmentObject(self.data)
}
}
show_modal_edit是Bool的列表,我检查了这些值,显然将正确的值传递给了.sheet()的isPresented字段。
答案 0 :(得分:0)
我已经设置了以下代码的测试版本,将数据重命名为Datax后,在ios 13.4和macOS催化剂上,一切都对我来说运行良好。
这指向editProduct()中的函数
self.data.editProduct(listIndex: self.listIndex, product: self.product, productName: self.productName, quantity: self.quantity)
作为问题的可能根源。具体来说,使用数据作为类型的名称。似乎与系统struct数据类型冲突。尝试将ObservableObject类重命名为其他名称(在我的测试中为Datax)。
import SwiftUI
class Datax: ObservableObject {
@Published var xxx = "xxx"
func editProduct(listIndex: Int, product: String, productName: String, quantity: Int) {
print("---> editProduct")
}
}
struct ContentView: View {
var data = Datax()
@State var showEditProductForm = false
var body: some View {
VStack {
Text("main view")
Button("EditProductForm") {
self.showEditProductForm.toggle()
}
}.sheet(isPresented: $showEditProductForm) {
EditProductForm(listIndex: 2, product: "product", quantity: 1, productName: "productName")
.environmentObject(self.data)
}
}
}
struct EditProductForm: View {
@EnvironmentObject var data: Datax
@Environment(\.presentationMode) var presentationModeEdit: Binding<PresentationMode>
var listIndex: Int
var product: String
@State var quantity: Int
@State var productName: String
func editProduct() {
self.data.editProduct(listIndex: self.listIndex, product: self.product, productName: self.productName, quantity: self.quantity)
}
var body: some View {
VStack{
Spacer()
VStack(spacing: 64){
Text("Edit Product")
TextField("Edit the name", text: $productName)
Picker(selection: $quantity, label: Text("Quantity")){
Text("OK").tag(0)
Text("Almost finished").tag(1)
Text("Finished").tag(2)
}.pickerStyle(SegmentedPickerStyle())
Button(action: {
self.editProduct()
self.presentationModeEdit.wrappedValue.dismiss()
}){
Text("Save")
}
}
Spacer()
}.padding(.horizontal)
}
}
希望这可以帮助您查找问题。