【问题标题】:How to programmatically make a List's editMode inactive when leaving the view with SwiftUI?使用 SwiftUI 离开视图时,如何以编程方式使 List 的 editMode 处于非活动状态?
【发布时间】:2021-04-25 17:09:05
【问题描述】:

给定一个带有 EditButton() 的列表视图,如果正在编辑视图(用户点击编辑按钮),当用户导航离开视图时,如何以编程方式禁用编辑模式? (例如,与 iPhone 上电话应用程序中的收藏夹视图类似的行为)

struct ContentView2: View {
    @State var fruits = ["Apple", "Banana"]

    var body: some View {
        NavigationView {
            List {
                ForEach(fruits, id: \.self) { fruit in
                    Text(fruit)
                }
                .onDelete { _ in
                    print("Delete")
                }
            }
            .toolbar {
                EditButton()
            }
        }
        .onDisappear {
            // make List's editMode be .inactive; how?
        }
    }
}

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    您可以使用.environment 将列表的当前编辑模式与@State 属性绑定,如awesome article 所示。

    struct ContentView: View {
        @State var editMode = EditMode.inactive /// the edit mode
    
        @State var fruits = ["Apple", "Banana"]
        
        var body: some View {
            NavigationView {
                List {
                    ForEach(fruits, id: \.self) { fruit in
                        Text(fruit)
                    }
                    .onDelete { _ in
                        print("Delete")
                    }
                }
                .toolbar {
                    EditButton()
                }
                .environment(\.editMode, $editMode) /// bind it here!
            }
            .onDisappear {
                editMode = .inactive /// set to inactive
            }
        }
    }
    

    此外,如果您使用NavigationLink 来呈现新视图,您的onDisappear 将不会被调用,因为您附加到它的NavigationView 实际上不会消失。您应该将其附加到NavigationLink 的标签上(来自this answer)。

    最终代码:

    struct ContentView: View {
        @State var editMode = EditMode.inactive /// the edit mode
        @State var fruits = ["Apple", "Banana"]
        
        var body: some View {
            NavigationView {
                VStack {
                    NavigationLink(destination:  Text("New view!")) {
                        Text("Navigate away")
                            .onDisappear {
                                editMode = .inactive /// set to inactive
                            }
                    }
                    
                    List {
                        ForEach(fruits, id: \.self) { fruit in
                            Text(fruit)
                        }
                        .onDelete { _ in
                            print("Delete")
                        }
                    }
                    .toolbar {
                        EditButton()
                    }
                    .environment(\.editMode, $editMode) /// bind it here!
                }
            }
        }
    }
    

    结果:

    Without editMode = .inactive With editMode = .inactive

    【讨论】:

    • 太好了,谢谢。事实证明我尝试过类似的东西,但我已经添加了 .environment(\.editMode, $editMode) before 破坏按钮的工具栏/按钮。添加按钮后进行绑定是幸福的关键。很高兴为未来的读者了解。
    • @vmallet 是的! SwiftUI 修饰符排序非常具体
    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多