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() 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章