SwiftUI-EditMode和PresentationMode环境

时间:2019-09-24 16:20:55

标签: swiftui

如何在EditMode和PresentationMode环境中显示表单?

示例:

当用户点击EditButton时,它将在EditMode中显示Form,并以文本文件作为输入,并更改导航标题

import SwiftUI

struct FormView: View {

    var body: some View {

        NavigationView {


        Form {


            Text("Placeholder")

            // On EditMode it should show this
            // TextField("Placeholder", text: Value)

           }

        .navigationBarTitle("Presentation Mode")
        // On EditMode it should show this
        // .navigationBarTitle("Edit Mode")

        .navigationBarItems(trailing: EditButton())






 }


    }
}

struct FormView_Previews: PreviewProvider {
    static var previews: some View {

        FormView()
    }
}

enter image description here

2 个答案:

答案 0 :(得分:0)

那是获得可编辑表格的一种方式:

struct FormView: View {

    @State private var isEditing = false
    @State private var text = ""

    var body: some View {
        NavigationView {
            Form {
                TextField("Placeholder",
                          text: $text)
                    .disabled(!isEditing)
            }
            .navigationBarTitle(isEditing ? "Edit Mode" : "Presentation Mode")
            .navigationBarItems(trailing: Button(isEditing ? "Save" : "Edit") {
                self.isEditing.toggle()
            })
        }
    }
}

答案 1 :(得分:0)

在这种情况下,使用editMode环境变量时,出于某些原因EditButton()不能单独工作。而使用自定义按钮时,editMode可以正确切换。

有趣的是,如果将EditButton()与自定义按钮一起添加(出于测试目的),则在使用自定义按钮至少一次切换该值一次之后,EditButton()也会栩栩如生,提供预期的行为。

以下代码段对我来说效果很好:

import SwiftUI

struct TempView2: View {
    @Environment(\.editMode) var editMode

    @State var textValue : String = "abc"

    var body: some View {
        NavigationView {
            Form {
                TextField("Placeholder", text: $textValue)
                    .disabled(.inactive == self.editMode?.wrappedValue)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                    .foregroundColor((.active == self.editMode?.wrappedValue) ? Color.red : Color.green)
                    .navigationBarTitle(.inactive == self.editMode?.wrappedValue ? "Presentation Mode" : "Edit Mode")
                    .navigationBarItems(trailing:
                        HStack {
                            //Spacer()
                            //EditButton()
                            Spacer()
                            Button(action: {
                                self.editMode?.wrappedValue = .active == self.editMode?.wrappedValue ? .inactive : .active
                            }) {
                                Text(.active == self.editMode?.wrappedValue ? "Done" : "Edit")
                            }
                            Spacer()
                    })
            }
        }
    }
}