SwiftUI EditButton()错误

时间:2020-10-18 19:21:57

标签: ios swift swiftui

我正在模态中显示一个列表。如果我在NavigationView中,则EditButton完全坏了。

enter image description here

struct ContentView: View {
@State var showSheetView = false

var body: some View {
    NavigationView {
        Button(action: {
            self.showSheetView.toggle()
        }) {
            Image(systemName: "bell.circle.fill")
                .font(Font.system(.title))
        }
        .sheet(isPresented: $showSheetView) {
            SheetView()
        }
    }
}
}

struct SheetView: View {
@State private var myArray: [String] = ["One", "Two", "Three"]
var body: some View {
    NavigationView {
        VStack {
            List {
                ForEach(myArray, id: \.self) { item in
                    Text(item)
                }.onDelete(perform: { indexSet in
                })
            }
        }
        .navigationBarItems(trailing: EditButton())
    }
}
}

如果我删除了我当前所在的NavigationView,那么起初它似乎可以正常工作,而我第二次出现时,它又被破坏了。

struct ContentView: View {
@State var showSheetView = false

var body: some View {
        Button(action: {
            self.showSheetView.toggle()
        }) {
            Image(systemName: "bell.circle.fill")
                .font(Font.system(.title))
        }
        .sheet(isPresented: $showSheetView) {
            SheetView()
        }
}
}

enter image description here

2 个答案:

答案 0 :(得分:2)

在使用Xcode 12.1 / iOS 14.1的macOS Big Sur上,手动处理editMode对我有用。

旋转模拟器时,我还遇到EditButton在编辑模式下再次显示“编辑”的问题,以下解决方案也解决了该问题。

以下解决方案使用定制的EditButton结构来处理手动editMode绑定。 首先是自定义EditButton

struct EditButton: View {
    @Binding var editMode: EditMode

    var body: some View {
        Button {
            switch editMode {
            case .active: editMode = .inactive
            case .inactive: editMode = .active
            default: break
            }
        } label: {
            if let isEditing = editMode.isEditing, isEditing {
                Text("Done")
            } else {
                Text("Edit")
            }
        }
    }
}

使用上面的EditButton很简单:

struct SheetView: View {
    @State private var myArray: [String] = ["One", "Two", "Three"]
    @State private var editMode = EditMode.inactive

    var body: some View {
        NavigationView {
            VStack {
                List {
                    ForEach(myArray, id: \.self) { item in
                        Text(item)
                    }.onDelete(perform: { indexSet in
                    })
                }
            }
            .navigationBarItems(trailing: EditButton(editMode: $editMode))
            .environment(\.editMode, $editMode)
            .animation(.spring(response: 0))
        }
    }
}

尾随导航栏中的EditButton处理保存在@State private var editMode中的SheetView。 然后,使用环境editMode将此.environment(\.editMode, $editMode)注入到内部视图中。 对于编辑模式过渡的动画效果,我发现.spring(response: 0)最合适。

答案 1 :(得分:2)

代替

.navigationBarItems(trailing: EditButton())

你可以试试:

.toolbar { EditButton() }

我遇到了同样的问题,这对我来说很好。