SwiftUI 按钮作为编辑按钮

问题描述 投票:0回答:5

如何使用像

EditButton
这样的按钮?
或者我如何使用按钮从列表中激活编辑模式?
或者我如何更改
EditButton
“编辑”/“完成”的名称?

swift button swiftui
5个回答
26
投票

下面的实现将

EditButton
的功能替换为
Button
:

import SwiftUI

struct ContentView: View {

    @State var isEditing = false
    @State var selection = Set<String>()

    var names = ["Karl", "Hans", "Faustao"]

    var body: some View {
        NavigationView {
            VStack {
                List(names, id: \.self, selection: $selection) { name in
                    Text(name)
                }
                .navigationBarTitle("Names")
                .environment(\.editMode, .constant(self.isEditing ? EditMode.active : EditMode.inactive)).animation(Animation.spring())
                Button(action: {
                    self.isEditing.toggle()
                }) {
                    Text(isEditing ? "Done" : "Edit")
                        .frame(width: 80, height: 40)
                }
                .background(Color.yellow)
            }
            .padding(.bottom)
        }
    }
}

#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

结果

但是,这样做时,选择处理需要由我们自己实现(这可能是也可能不是问题)。

不幸的是,目前还没有太多相关文档: https://developer.apple.com/documentation/swiftui/list/3367016-init


13
投票

这是一种保留

EditButton
功能同时仍观察变化的方法。

EditButton()
    .simultaneousGesture(TapGesture().onEnded {
        // Do your thing
    })

这适用于您想要观察点击的每个视图。


7
投票

Beta 5 中有更好的方法来做到这一点,您可以直接获取

@Environment
绑定(也最好将其设为导航栏项目):

import SwiftUI

struct EditableListView: View {

    @State var items: [String] = ["1", "2", "3"]
    @State var selections: Set<String> = []

    @Environment(\.editMode) private var editMode: Binding<EditMode>

    var body: some View {
        List(items, id: \.self, selection: $selections) { item in
            Text(item)
        }
        .navigationBarItems(trailing:
            Button(action: {
                self.editMode?.value.toggle()
            }) {
                Text(self.editMode?.value == .active ? "Done" : "Edit")
            }
        )
        .animation(.default)
    }
}

extension EditMode {

    mutating func toggle() {
        self = self == .active ? .inactive : .active
    }
}


3
投票

至于Xcode 13,似乎有一些更新。我测试了以下代码的工作原理。

@State var editMode: EditMode = .inactive
@State var isEditing = false

List {
    // (your list code here)
}.environment(\.editMode, $editMode)

Button(action: {
    isEditing.toggle()
    editMode = isEditing ? .active : .inactive
})

0
投票

您也可以使用如下所示的普通按钮:

    .navigationBarItems(trailing: HStack{
        Button(action: {
            editMode?.wrappedValue.toggle()
        }, label: {
            Text(editButtinTxt)
        })
    })

和文字:

var editBtnTxt : String {
    
    if let isEditing = editMode?.wrappedValue.isEditing {
        return isEditing ? "Done" : "Edit"
    }else {
        return ""
    }
}

别忘了

@Environment(\.editMode) var editMode
© www.soinside.com 2019 - 2024. All rights reserved.