为什么SwiftUI模式视图会在此处更新父变量(附加代码)

时间:2020-04-06 20:08:21

标签: swift core-data swiftui

在下面的代码中,如果我更改TextField的值,然后单击“取消”(即将不保存coredata),则在隐藏此模式视图后,其值会在父级UI列表中更改吗?

这行有效地通过了我的裁判吗?如果是的话,如何有效地改变价值?

更新:实际上,在取消按钮中的代码之后,实际上出现了“保存”按钮中的代码正被调用,这是在我单击“取消”的情况下。不确定为什么会这样吗?

代码:

import SwiftUI

struct GCListsViewEdit: View {
    @Environment (\.presentationMode) var presentationMode
    @State var titleStr : String = ""
    var gcItem : GCList?

    var body: some View {
        NavigationView {
            Form {
                Section(header: Text("Enter Details")) {
                    TextField("List Title", text: self.$titleStr)
                        .onAppear {
                            self.titleStr = self.gcItem?.title ?? ""  // ** HERE **
                        }
                }
                HStack {
                    Button("Cancel") {
                        self.presentationMode.wrappedValue.dismiss()
                    }
                    Spacer()
                    Button("Save") {
                        guard !self.titleStr.isEmpty else {
                            return
                        }
                        guard let item = self.gcItem else {
                            return
                        }
                        item.title = self.titleStr
                        GCCoreData.save()
                        self.presentationMode.wrappedValue.dismiss()
                    }
                }
            }
            .navigationBarTitle("Edit List")
        }
    }
}

父母-只是身体的一部分

var body : some View {
    NavigationView {
        VStack {

            // -- Main List  --
            List() {
                ForEach(gcLists) { gcList in
                    HStack {
                        if self.editMode {
                            Button(action: {}) {
                              Text("\(gcList.title)")
                            }
                            .onTapGesture {
                                self.selectedListViewItem = gcList
                                self.newListItemTitle = gcList.title
                                self.showEditView.toggle()
                            }
                            .sheet(isPresented: self.$showEditView, content: {
                                GCListsViewEdit(gcItem: self.selectedListViewItem!)
                            })
                        } else {
                            NavigationLink(destination: GCTasksView(withGcList: gcList)) {
                                Text("\(gcList.title)")
                            }
                        }
                    }
                }
                .onDelete(perform: self.deleteList)
                .onMove(perform: self.move)

            }
            .environment(\.editMode, editMode ? .constant(.active) : .constant(.inactive))
            .alert(isPresented: $showingAlert) {
                Alert(
                    title: Text(verbatim: "Important Message"),
                    message: Text(self.alertString),
                    dismissButton: Alert.Button.default(Text(verbatim: "Cancel"))
                )
            }
            .navigationBarTitle( Text("Todo Lists") )
            .navigationBarItems(
                trailing: Button(action: {
                    print("Edit" as Any)
                    self.editMode = !self.editMode
                } ) {
                    Text(editMode ? "Done" : "Edit")
                }
            )

            // -- Add List Item ---selectedListViewItem
            Button("Add List") {
                self.newListItemTitle = ""
                self.showAddView.toggle()
            }
            .sheet(isPresented: $showAddView, content: { GCListsViewAdd() } )

        }
    }
}

1 个答案:

答案 0 :(得分:1)

FormList的一种,而List对一行中的标准按钮进行了特定的处理-它使整个行都处于活动状态,因此当在任何位置轻按该按钮时( )被激活。

在您的示例中,即使您在“取消”和“保存”之间点击,也会执行两个操作。

有几种可能的解决方案:

1)使用点击手势(保持按钮或将其替换为其他视图,文本,图像等),例如


HStack {
    Button("Cancel") {}
    .onTapGesture {
        print(">> do cancel")
    }
    Spacer()
    Button("Save") {}
    .onTapGesture {
        print(">> do save")
    }
}

2)使用自定义按钮样式,因为List仅拦截DefaultButtonStyle个按钮

struct CustomButton: ButtonStyle {
    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .foregroundColor(configuration.isPressed ? Color.gray : Color.blue)
        }
}

HStack {
    Button("Cancel") {
        print(">> do cancel")
    }.buttonStyle(CustomButton())
    Spacer()
    Button("Save") {
        print(">> do save")
    }.buttonStyle(CustomButton())
}

3)在此屏幕上将按钮移出Form(例如,在NavigationBar中)