presentationMode.wrappedValue.dismiss () не работает должным образом - PullRequest
0 голосов
/ 26 апреля 2020

Я использую метод листа, чтобы отобразить простую форму, и я передаю ей пару переменных. Проблема в том, что если я нажимаю кнопку, которая выполняет метод .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 значение, и оно фактически переключается, когда я нажимаю кнопку, но лист остается там.

Вот код, в котором я использую form:

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, я проверил значения и, по-видимому, правильное значение передается в поле isPresented .sheet ().

1 Ответ

0 голосов
/ 27 апреля 2020

Я установил следующую тестовую версию вашего кода, и все работает хорошо для меня на ios 13.4 и macos катализатора после переименования данных в Datax.

Это указывает на функцию в editProduct ()

        self.data.editProduct(listIndex: self.listIndex, product: self.product, productName: self.productName, quantity: self.quantity)

как возможный источник вашей проблемы. В частности, используя данные в качестве имени для вашего типа. Похоже на кла sh с системной структурой Тип данных. Попробуйте переименовать ваш класс 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)
}
}

Надеюсь, это поможет отследить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...