【问题标题】:SwiftUI - How do I make edit rows in a list?SwiftUI - 如何在列表中编辑行?
【发布时间】:2019-08-14 14:13:11
【问题描述】:

我想使用 EditButton() 来切换编辑模式,并让我的列表行切换到编辑模式。我想在编辑模式中包含一个新按钮以打开模式。我什至无法获得 EditMode 值来切换行内容。

struct ContentView: View {

    @Environment(\.editMode) var isEditMode

    var sampleData = ["Hello", "This is a row", "So is this"]

    var body: some View {
        NavigationView {

            List(sampleData, id: \.self) { rowValue in
                if (self.isEditMode?.value == .active) {
                    Text("now is edit mode")  // this is never displayed
                } else  {
                    Text(rowValue)
                }
            }
            .navigationBarTitle(Text("Edit A Table?"), displayMode: .inline)
            .navigationBarItems(trailing:
                EditButton()
            )
        }
    }
}

【问题讨论】:

    标签: swiftui swiftui-list


    【解决方案1】:

    需要在List中设置editMode的环境值:

    struct ContentView: View {
        @State var isEditMode: EditMode = .inactive
    
        var sampleData = ["Hello", "This is a row", "So is this"]
    
        var body: some View {
            NavigationView {
                List(sampleData, id: \.self) { rowValue in
                    if (self.isEditMode == .active) {
                        Text("now is edit mode")
                    } else  {
                        Text(rowValue)
                    }
                }
                .navigationBarTitle(Text("Edit A Table?"), displayMode: .inline)
                .navigationBarItems(trailing: EditButton())
                .environment(\.editMode, self.$isEditMode)
            }
        }
    }
    

    您需要小心,确保.environment(\.editMode, self.$isEditMode).navigationBarItems(trailing: EditButton()) 之后。

    【讨论】:

    • 我是否正确假设这种方法有效,因为 editMode 环境变量最初设置为绑定到状态变量,该状态变量也最终接收由 EditButton 对环境变量所做的更改?如果是这样,这是一个非常有用的工具。
    • @ChuckH 是的,这基本上就是它的作用。;-)
    【解决方案2】:

    添加到@kontiki 答案,如果您更喜欢为editMode 使用布尔值以便更容易修改,请使用此@State 变量:

    @State var editMode: Bool = false
    

    并将.environment修饰符修改为:

    .environment(\.editMode, .constant(self.editMode ? EditMode.active : EditMode.inactive))
    

    现在使用您自己的按钮切换到/从编辑模式非常简单:

    Button(action: {
        self.editMode = !self.editMode
    }, label: {
        Text(!self.editMode ? "Edit" : "Done")
    })
    

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多