SwiftUI EditButton() 错误

God*_*her 6 ios swift swiftui

我在模态中呈现一个列表。如果我在 NavigationView 中,EditButton 就完全损坏了。

在此输入图像描述

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())
    }
}
}
Run Code Online (Sandbox Code Playgroud)

如果我删除我呈现的导航视图,那么一开始它似乎可以工作,第二次我呈现它时它会再次损坏。

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()
        }
}
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Jay*_*Lee 7

editMode使用 Xcode 12.1 / iOS 14.1 在 macOS Big Sur 上手动处理工作。

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")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用上面的内容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))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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