presentationMode.wrappedValue.dismiss() 无法正常工作
Posted
技术标签:
【中文标题】presentationMode.wrappedValue.dismiss() 无法正常工作【英文标题】:presentationMode.wrappedValue.dismiss() not working properly 【发布时间】:2020-04-26 18:01:16 【问题描述】:我正在使用 sheet 方法来显示一个简单的表单,并向其中传递了几个变量。问题是,如果我在更改传入的变量后单击执行 .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 字段。
【问题讨论】:
【参考方案1】:我已经设置了您的代码的以下测试版本,在将 Data 重命名为 Datax 后,我在 ios 13.4 和 macos 催化剂上运行良好。
这里指向editProduct()中的函数
self.data.editProduct(listIndex: self.listIndex, product: self.product, productName: self.productName, quantity: self.quantity)
作为您问题的可能根源。具体来说,使用 Data 作为您的类型的名称。它似乎与系统结构数据类型发生冲突。尝试将 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)
希望这有助于追踪您的问题。
【讨论】:
感谢您的回答,但不幸的是,这对我不起作用。我怀疑原因可能是 editPorduct 方法,因为在不同的文件中我调用了类似的方法,但解雇有效。也许这与我的“EditProductForm”在 ForEach 中的事实有关。我在我的问题中添加了代码。以上是关于presentationMode.wrappedValue.dismiss() 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章