在编辑模式下,如何删除SwiftUI列表行中的“删除”按钮?

在编辑模式下,如何删除SwiftUI列表行中的“删除”按钮?,swiftui,swiftui-list,Swiftui,Swiftui List,在编辑模式下,如何删除SwiftUI列表行中的“删除”按钮?请注意,行右侧允许重新订购行的汉堡按钮需要继续运行 后台-希望列表始终启用“重新排序”行功能。编辑模式似乎启用了此功能(即在编辑模式下保留列表),但不希望每行上都有红色的删除按钮 这是一个特定于SwiftUI的问题 编辑:仅在此处删除删除按钮后,滑动删除仍然有效…Xcode 11.2,Swift 5.1 只要不在列表中提供onDelete,就不会有删除按钮 下面是一个例子 import SwiftUI import Combine s

在编辑模式下,如何删除SwiftUI列表行中的“删除”按钮?请注意,行右侧允许重新订购行的汉堡按钮需要继续运行

后台-希望列表始终启用“重新排序”行功能。编辑模式似乎启用了此功能(即在编辑模式下保留列表),但不希望每行上都有红色的删除按钮

这是一个特定于SwiftUI的问题

编辑:仅在此处删除删除按钮后,滑动删除仍然有效…

Xcode 11.2,Swift 5.1 只要不在列表中提供onDelete,就不会有删除按钮

下面是一个例子

import SwiftUI
import Combine

struct ContentView: View {
    @State private var objects = ["1", "2", "3"]

    var body: some View {
        NavigationView {
            List {
                ForEach(objects, id: \.self) { object in
                    Text("Row \(object)")
                }
                .onMove(perform: relocate)
            }
            .navigationBarItems(trailing: EditButton())
        }
    }

    func relocate(from source: IndexSet, to destination: Int) {
        objects.move(fromOffsets: source, toOffset: destination)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

替代方法(有限制)


有一个修饰符,只需添加“.deleteDisabled(true)”。您还可以向其中传递一个变量,从而有条件地禁用删除。

实际上,我只是想了解如何删除按钮,所以向左滑动以删除仍然可以工作-如果可能的话?我认为这是不可能的(在SwiftUI和UIKit中),因为“滑动以删除”手势在编辑模式下被禁用,不会干扰拖动。红色的减号按钮代替了滑动手势。您可以在编辑模式下禁用delte,并将其作为一个选项保留。实际上,我只是想了解如何删除按钮,所以向左滑动以删除仍然可以工作-如果可能的话?我找到了方法,它可以提供您想要的视觉行为,但是。。。有一些限制-阅读代码commentsHi@Greg,你找到你的问题的解决方案了吗?没有。所以我只是假设暂时不可能。我@Greg,似乎这家伙找到了方法,
struct ContentView: View {
    @State private var objects = ["1", "2", "3"]
    @Environment(\.editMode) var editMode

    var body: some View {
//        NavigationView {
        VStack {
            // !!!  A. using NavigationView instead of VStack above does not work,
            // !!!  because editMode is not updated and always .inactive
            // !!!  B. Also it does not work in Preview, but works in run-time
            EditButton()
            List {

                ForEach(objects, id: \.self) { object in
                    Text("Row \(object)")
                }
                .onMove(perform: relocate)
                .onDelete(perform: delete)
                .deleteDisabled(disableDelete)
            }
//                .navigationBarItems(trailing: EditButton())
        }
    }

    var disableDelete: Bool {
        if let mode = editMode?.wrappedValue, mode == .active {
            return true
        }
        return false
    }

    func relocate(from source: IndexSet, to destination: Int) {
        objects.move(fromOffsets: source, toOffset: destination)
    }

    func delete(from source: IndexSet?) {
        objects.remove(atOffsets: source!)
    }
}